@push.rocks/smartjmap 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,13 @@
1
- import * as plugins from './smartjmap.plugins.js';
2
- import { JMAP_CORE_CAPABILITY, JMAP_MAIL_CAPABILITY, JMAP_SUBMISSION_CAPABILITY, } from './classes.jmapclient.js';
3
- import {} from './interfaces.backend.js';
4
- import { MemoryMailBackend } from './classes.memorymailbackend.js';
1
+ import * as plugins from "./smartjmap.plugins.js";
2
+ import { JMAP_CORE_CAPABILITY, JMAP_MAIL_CAPABILITY, JMAP_SUBMISSION_CAPABILITY, } from "./classes.jmapclient.js";
3
+ import {} from "./interfaces.backend.js";
4
+ import { MemoryMailBackend } from "./classes.memorymailbackend.js";
5
+ /**
6
+ * Semantic capability marker for the bounded streaming-upload server surface.
7
+ * Consumers must check this exact value before relying on streaming backend
8
+ * uploads, upload concurrency limits, Bearer-only challenges, or error mapping.
9
+ */
10
+ export const JMAP_SERVER_STREAMING_API_VERSION = 1;
5
11
  /** The advertised — and enforced — RFC 8620 core limits. */
6
12
  export const JMAP_SERVER_LIMITS = {
7
13
  maxSizeUpload: 50_000_000,
@@ -13,59 +19,59 @@ export const JMAP_SERVER_LIMITS = {
13
19
  maxObjectsInSet: 500,
14
20
  };
15
21
  /** The session object never changes at runtime, so its state is constant. */
16
- const SESSION_STATE = '0';
22
+ const SESSION_STATE = "0";
17
23
  /** Default Email/get properties per RFC 8621 §4.2. */
18
24
  const DEFAULT_EMAIL_PROPERTIES = [
19
- 'id',
20
- 'blobId',
21
- 'threadId',
22
- 'mailboxIds',
23
- 'keywords',
24
- 'size',
25
- 'receivedAt',
26
- 'messageId',
27
- 'inReplyTo',
28
- 'references',
29
- 'sender',
30
- 'from',
31
- 'to',
32
- 'cc',
33
- 'bcc',
34
- 'replyTo',
35
- 'subject',
36
- 'sentAt',
37
- 'hasAttachment',
38
- 'preview',
39
- 'bodyValues',
40
- 'textBody',
41
- 'htmlBody',
42
- 'attachments',
25
+ "id",
26
+ "blobId",
27
+ "threadId",
28
+ "mailboxIds",
29
+ "keywords",
30
+ "size",
31
+ "receivedAt",
32
+ "messageId",
33
+ "inReplyTo",
34
+ "references",
35
+ "sender",
36
+ "from",
37
+ "to",
38
+ "cc",
39
+ "bcc",
40
+ "replyTo",
41
+ "subject",
42
+ "sentAt",
43
+ "hasAttachment",
44
+ "preview",
45
+ "bodyValues",
46
+ "textBody",
47
+ "htmlBody",
48
+ "attachments",
43
49
  ];
44
50
  const KNOWN_EMAIL_PROPERTIES = new Set(DEFAULT_EMAIL_PROPERTIES);
45
51
  const MAILBOX_PROPERTIES = [
46
- 'id',
47
- 'name',
48
- 'parentId',
49
- 'role',
50
- 'sortOrder',
51
- 'totalEmails',
52
- 'unreadEmails',
53
- 'totalThreads',
54
- 'unreadThreads',
55
- 'myRights',
56
- 'isSubscribed',
52
+ "id",
53
+ "name",
54
+ "parentId",
55
+ "role",
56
+ "sortOrder",
57
+ "totalEmails",
58
+ "unreadEmails",
59
+ "totalThreads",
60
+ "unreadThreads",
61
+ "myRights",
62
+ "isSubscribed",
57
63
  ];
58
64
  const KNOWN_MAILBOX_PROPERTIES = new Set(MAILBOX_PROPERTIES);
59
65
  const SUPPORTED_EMAIL_FILTER_KEYS = new Set([
60
- 'inMailbox',
61
- 'text',
62
- 'subject',
63
- 'from',
64
- 'to',
65
- 'before',
66
- 'after',
67
- 'hasKeyword',
68
- 'notKeyword',
66
+ "inMailbox",
67
+ "text",
68
+ "subject",
69
+ "from",
70
+ "to",
71
+ "before",
72
+ "after",
73
+ "hasKeyword",
74
+ "notKeyword",
69
75
  ]);
70
76
  const DEFAULT_MAILBOX_RIGHTS = {
71
77
  mayReadItems: true,
@@ -80,7 +86,9 @@ const DEFAULT_MAILBOX_RIGHTS = {
80
86
  };
81
87
  const textEncoder = new TextEncoder();
82
88
  /** Ensures bytes are backed by a plain ArrayBuffer so they satisfy BodyInit. */
83
- const asBodyBytes = (data) => data.buffer instanceof ArrayBuffer ? data : new Uint8Array(data);
89
+ const asBodyBytes = (data) => data.buffer instanceof ArrayBuffer
90
+ ? data
91
+ : new Uint8Array(data);
84
92
  /** Error type used inside method dispatch; rendered as a JMAP `error` method response. */
85
93
  class JmapServerMethodError extends Error {
86
94
  constructor(type, description) {
@@ -88,6 +96,12 @@ class JmapServerMethodError extends Error {
88
96
  this.type = type;
89
97
  }
90
98
  }
99
+ class JmapRequestBodyError extends Error {
100
+ constructor(reason) {
101
+ super(reason);
102
+ this.reason = reason;
103
+ }
104
+ }
91
105
  /** UTF-8-safe truncation: cuts at a codepoint boundary at or below maxBytes. */
92
106
  const truncateUtf8 = (value, maxBytes) => {
93
107
  const bytes = textEncoder.encode(value);
@@ -106,32 +120,33 @@ const truncateUtf8 = (value, maxBytes) => {
106
120
  * flattening one array level. Throws on any unresolvable path.
107
121
  */
108
122
  const evalJsonPointer = (root, pointer) => {
109
- if (pointer === '') {
123
+ if (pointer === "") {
110
124
  return root;
111
125
  }
112
- if (!pointer.startsWith('/')) {
126
+ if (!pointer.startsWith("/")) {
113
127
  throw new Error(`Invalid JSON pointer "${pointer}".`);
114
128
  }
115
- const tokens = pointer.slice(1).split('/');
129
+ const tokens = pointer.slice(1).split("/");
116
130
  const evaluate = (value, index) => {
117
131
  if (index === tokens.length) {
118
132
  return value;
119
133
  }
120
- const token = tokens[index].replaceAll('~1', '/').replaceAll('~0', '~');
134
+ const token = tokens[index].replaceAll("~1", "/").replaceAll("~0", "~");
121
135
  if (Array.isArray(value)) {
122
- if (token === '*') {
136
+ if (token === "*") {
123
137
  const results = value.map((item) => evaluate(item, index + 1));
124
138
  return results.some((result) => Array.isArray(result))
125
139
  ? results.flatMap((result) => (Array.isArray(result) ? result : [result]))
126
140
  : results;
127
141
  }
128
142
  const arrayIndex = Number(token);
129
- if (!Number.isInteger(arrayIndex) || arrayIndex < 0 || arrayIndex >= value.length) {
143
+ if (!Number.isInteger(arrayIndex) || arrayIndex < 0 ||
144
+ arrayIndex >= value.length) {
130
145
  throw new Error(`JSON pointer index "${token}" is out of range.`);
131
146
  }
132
147
  return evaluate(value[arrayIndex], index + 1);
133
148
  }
134
- if (value !== null && typeof value === 'object' && token in value) {
149
+ if (value !== null && typeof value === "object" && token in value) {
135
150
  return evaluate(value[token], index + 1);
136
151
  }
137
152
  throw new Error(`JSON pointer token "${token}" does not resolve.`);
@@ -161,9 +176,39 @@ export class JmapServer {
161
176
  this.sockets = new Set();
162
177
  this.eventStreams = new Set();
163
178
  this.changeFeedUnsubscribe = null;
179
+ this.cleanupErrors = [];
164
180
  this.activeApiRequests = 0;
181
+ this.activeUploadRequests = 0;
182
+ this.activeUploadsByPrincipal = new Map();
183
+ this.activeNodeRequests = new Set();
184
+ this.nodeRequestControllers = new Set();
185
+ this.stopping = false;
165
186
  this.options = options;
166
187
  this.backend = options.backend ?? new MemoryMailBackend();
188
+ const authenticationChallenges = options.authenticationChallenges ?? [
189
+ 'Bearer realm="jmap"',
190
+ 'Basic realm="jmap"',
191
+ ];
192
+ if (authenticationChallenges.length === 0 ||
193
+ authenticationChallenges.some((challenge) => typeof challenge !== "string" || !challenge.trim() ||
194
+ /[\r\n]/.test(challenge))) {
195
+ throw new Error("authenticationChallenges must contain safe non-empty challenge values.");
196
+ }
197
+ this.authenticationChallenges = authenticationChallenges
198
+ .map((value) => value.trim())
199
+ .join(", ");
200
+ this.limits = { ...JMAP_SERVER_LIMITS, ...options.limits };
201
+ for (const [name, value] of Object.entries(this.limits)) {
202
+ if (!Number.isSafeInteger(value) || value <= 0) {
203
+ throw new Error(`JMAP limit ${name} must be a positive safe integer.`);
204
+ }
205
+ }
206
+ this.maxConcurrentUploadServer = options.maxConcurrentUploadServer ??
207
+ this.limits.maxConcurrentUpload;
208
+ if (!Number.isSafeInteger(this.maxConcurrentUploadServer) ||
209
+ this.maxConcurrentUploadServer < this.limits.maxConcurrentUpload) {
210
+ throw new Error("maxConcurrentUploadServer must be a safe integer at least as large as maxConcurrentUpload.");
211
+ }
167
212
  }
168
213
  // ======================
169
214
  // default auth registry
@@ -193,25 +238,70 @@ export class JmapServer {
193
238
  /** Starts a node:http server around fetchHandler. Resolves with the bound port (pass 0 for ephemeral). */
194
239
  start(port) {
195
240
  if (this.httpServer) {
196
- throw new Error('JmapServer is already started.');
241
+ throw new Error("JmapServer is already started.");
197
242
  }
243
+ this.stopping = false;
198
244
  const server = plugins.http.createServer((req, res) => {
199
- void this.handleNodeRequest(req, res);
245
+ if (this.stopping) {
246
+ res.writeHead(503, {
247
+ "content-type": "application/problem+json",
248
+ "connection": "close",
249
+ });
250
+ res.end(JSON.stringify({
251
+ type: "about:blank",
252
+ status: 503,
253
+ detail: "JMAP server is shutting down.",
254
+ }));
255
+ return;
256
+ }
257
+ const requestAbortController = new AbortController();
258
+ this.nodeRequestControllers.add(requestAbortController);
259
+ let requestTask;
260
+ requestTask = this.handleNodeRequest(req, res, requestAbortController)
261
+ .finally(() => {
262
+ this.nodeRequestControllers.delete(requestAbortController);
263
+ this.activeNodeRequests.delete(requestTask);
264
+ });
265
+ this.activeNodeRequests.add(requestTask);
266
+ void requestTask;
200
267
  });
201
- server.on('connection', (socket) => {
268
+ const onConnection = (socket) => {
202
269
  this.sockets.add(socket);
203
- socket.on('close', () => {
270
+ socket.on("close", () => {
204
271
  this.sockets.delete(socket);
205
272
  });
206
- });
273
+ };
274
+ server.on("connection", onConnection);
207
275
  this.httpServer = server;
208
276
  return new Promise((resolve, reject) => {
209
- server.once('error', reject);
210
- server.listen(port, () => {
277
+ const onStartupError = (error) => {
278
+ server.off("listening", onListening);
279
+ server.off("connection", onConnection);
280
+ if (this.httpServer === server) {
281
+ this.httpServer = null;
282
+ }
283
+ try {
284
+ server.close(() => undefined);
285
+ }
286
+ catch {
287
+ // The failed listener never reached the listening state.
288
+ }
289
+ reject(error);
290
+ };
291
+ const onListening = () => {
292
+ server.off("error", onStartupError);
293
+ server.on("error", (error) => {
294
+ this.cleanupErrors.push(error);
295
+ });
211
296
  const address = server.address();
212
- const boundPort = typeof address === 'object' && address ? address.port : port;
297
+ const boundPort = typeof address === "object" && address
298
+ ? address.port
299
+ : port;
213
300
  resolve(boundPort);
214
- });
301
+ };
302
+ server.once("error", onStartupError);
303
+ server.once("listening", onListening);
304
+ server.listen(port);
215
305
  });
216
306
  }
217
307
  /**
@@ -220,21 +310,38 @@ export class JmapServer {
220
310
  * and closes the node listener when one was started.
221
311
  */
222
312
  async stop() {
313
+ this.stopping = true;
314
+ const server = this.httpServer;
315
+ this.httpServer = null;
316
+ const listenerClosed = server
317
+ ? new Promise((resolve) => {
318
+ try {
319
+ server.close(() => resolve());
320
+ }
321
+ catch {
322
+ resolve();
323
+ }
324
+ })
325
+ : Promise.resolve();
223
326
  for (const stream of Array.from(this.eventStreams)) {
224
327
  this.closeStream(stream);
225
328
  }
329
+ for (const controller of this.nodeRequestControllers) {
330
+ if (!controller.signal.aborted) {
331
+ controller.abort(new Error("JMAP server is shutting down."));
332
+ }
333
+ }
226
334
  for (const socket of this.sockets) {
227
335
  socket.destroy();
228
336
  }
229
337
  this.sockets.clear();
230
- const server = this.httpServer;
231
- this.httpServer = null;
232
- if (server) {
233
- await new Promise((resolve) => {
234
- server.close(() => {
235
- resolve();
236
- });
237
- });
338
+ await listenerClosed;
339
+ while (this.activeNodeRequests.size) {
340
+ await Promise.allSettled([...this.activeNodeRequests]);
341
+ }
342
+ if (this.cleanupErrors.length) {
343
+ const errors = this.cleanupErrors.splice(0);
344
+ throw new AggregateError(errors, "JmapServer cleanup failed");
238
345
  }
239
346
  }
240
347
  // ======================
@@ -248,37 +355,41 @@ export class JmapServer {
248
355
  try {
249
356
  const principal = await this.authenticatePrincipal(request);
250
357
  if (!principal) {
251
- return this.problemResponse(401, 'about:blank', 'Authentication required', {
252
- 'www-authenticate': 'Bearer realm="jmap", Basic realm="jmap"',
358
+ await this.cancelRequestBody(request, "authentication rejected");
359
+ return this.problemResponse(401, "about:blank", "Authentication required", {
360
+ "www-authenticate": this.authenticationChallenges,
253
361
  });
254
362
  }
255
363
  const account = await this.backend.resolveAccount(principal);
256
364
  if (!account) {
257
- return this.problemResponse(403, 'about:blank', 'No account for this principal');
365
+ await this.cancelRequestBody(request, "account rejected");
366
+ return this.problemResponse(403, "about:blank", "No account for this principal");
258
367
  }
259
368
  const url = new URL(request.url);
260
369
  const pathname = url.pathname;
261
370
  const method = request.method.toUpperCase();
262
- if (method === 'GET' && (pathname === '/.well-known/jmap' || pathname === '/jmap/session')) {
371
+ if (method === "GET" &&
372
+ (pathname === "/.well-known/jmap" || pathname === "/jmap/session")) {
263
373
  return this.handleSession(account, principal);
264
374
  }
265
- if (method === 'POST' && pathname === '/jmap/api') {
375
+ if (method === "POST" && pathname === "/jmap/api") {
266
376
  return this.handleApi(account, request);
267
377
  }
268
- if (method === 'POST' && pathname.startsWith('/jmap/upload/')) {
269
- return this.handleUpload(account, pathname, request);
378
+ if (method === "POST" && pathname.startsWith("/jmap/upload/")) {
379
+ return this.handleUpload(account, principal, pathname, request);
270
380
  }
271
- if (method === 'GET' && pathname.startsWith('/jmap/download/')) {
381
+ if (method === "GET" && pathname.startsWith("/jmap/download/")) {
272
382
  return this.handleDownload(account, pathname, url);
273
383
  }
274
- if (method === 'GET' && pathname === '/jmap/eventsource') {
384
+ if (method === "GET" && pathname === "/jmap/eventsource") {
275
385
  return this.handleEventSource(account, url);
276
386
  }
277
- return this.problemResponse(404, 'about:blank', 'Not found');
387
+ await this.cancelRequestBody(request, "route rejected");
388
+ return this.problemResponse(404, "about:blank", "Not found");
278
389
  }
279
390
  catch (error) {
280
391
  const message = error instanceof Error ? error.message : String(error);
281
- return this.problemResponse(500, 'about:blank', message);
392
+ return this.problemResponse(500, "about:blank", message);
282
393
  }
283
394
  }
284
395
  // ======================
@@ -288,17 +399,17 @@ export class JmapServer {
288
399
  if (this.options.authenticate) {
289
400
  return this.options.authenticate(request);
290
401
  }
291
- const header = request.headers.get('authorization');
402
+ const header = request.headers.get("authorization");
292
403
  if (!header) {
293
404
  return null;
294
405
  }
295
- const spaceIndex = header.indexOf(' ');
406
+ const spaceIndex = header.indexOf(" ");
296
407
  if (spaceIndex === -1) {
297
408
  return null;
298
409
  }
299
410
  const scheme = header.slice(0, spaceIndex).toLowerCase();
300
411
  const value = header.slice(spaceIndex + 1).trim();
301
- if (scheme === 'bearer') {
412
+ if (scheme === "bearer") {
302
413
  for (const [username, entry] of this.registry) {
303
414
  if (entry.bearerTokens.has(value)) {
304
415
  return { username };
@@ -306,7 +417,7 @@ export class JmapServer {
306
417
  }
307
418
  return null;
308
419
  }
309
- if (scheme === 'basic') {
420
+ if (scheme === "basic") {
310
421
  let decoded;
311
422
  try {
312
423
  const binary = atob(value);
@@ -315,7 +426,7 @@ export class JmapServer {
315
426
  catch {
316
427
  return null;
317
428
  }
318
- const colonIndex = decoded.indexOf(':');
429
+ const colonIndex = decoded.indexOf(":");
319
430
  if (colonIndex === -1) {
320
431
  return null;
321
432
  }
@@ -336,8 +447,8 @@ export class JmapServer {
336
447
  const session = {
337
448
  capabilities: {
338
449
  [JMAP_CORE_CAPABILITY]: {
339
- ...JMAP_SERVER_LIMITS,
340
- collationAlgorithms: ['i;ascii-casemap'],
450
+ ...this.limits,
451
+ collationAlgorithms: ["i;ascii-casemap"],
341
452
  },
342
453
  [JMAP_MAIL_CAPABILITY]: {},
343
454
  [JMAP_SUBMISSION_CAPABILITY]: {},
@@ -352,8 +463,8 @@ export class JmapServer {
352
463
  maxMailboxesPerEmail: null,
353
464
  maxMailboxDepth: null,
354
465
  maxSizeMailboxName: 490,
355
- maxSizeAttachmentsPerEmail: JMAP_SERVER_LIMITS.maxSizeUpload,
356
- emailQuerySortOptions: ['receivedAt'],
466
+ maxSizeAttachmentsPerEmail: this.limits.maxSizeUpload,
467
+ emailQuerySortOptions: ["receivedAt"],
357
468
  mayCreateTopLevelMailbox: false,
358
469
  },
359
470
  [JMAP_SUBMISSION_CAPABILITY]: {
@@ -369,43 +480,53 @@ export class JmapServer {
369
480
  [JMAP_SUBMISSION_CAPABILITY]: account.accountId,
370
481
  },
371
482
  username: principal.username,
372
- apiUrl: this.buildUrl('/jmap/api'),
373
- downloadUrl: this.buildUrl('/jmap/download/{accountId}/{blobId}/{name}?type={type}'),
374
- uploadUrl: this.buildUrl('/jmap/upload/{accountId}'),
375
- eventSourceUrl: this.buildUrl('/jmap/eventsource?types={types}&closeafter={closeafter}&ping={ping}'),
483
+ apiUrl: this.buildUrl("/jmap/api"),
484
+ downloadUrl: this.buildUrl("/jmap/download/{accountId}/{blobId}/{name}?type={type}"),
485
+ uploadUrl: this.buildUrl("/jmap/upload/{accountId}"),
486
+ eventSourceUrl: this.buildUrl("/jmap/eventsource?types={types}&closeafter={closeafter}&ping={ping}"),
376
487
  state: SESSION_STATE,
377
488
  };
378
489
  return this.jsonResponse(200, session);
379
490
  }
380
491
  buildUrl(path) {
381
492
  const base = this.options.baseUrl;
382
- return base ? `${base.replace(/\/+$/, '')}${path}` : path;
493
+ return base ? `${base.replace(/\/+$/, "")}${path}` : path;
383
494
  }
384
495
  // ======================
385
496
  // api endpoint
386
497
  // ======================
387
498
  async handleApi(account, request) {
388
- if (this.activeApiRequests >= JMAP_SERVER_LIMITS.maxConcurrentRequests) {
389
- return this.limitResponse(429, 'maxConcurrentRequests', 'Too many concurrent requests.');
499
+ if (this.activeApiRequests >= this.limits.maxConcurrentRequests) {
500
+ await this.cancelRequestBody(request, "request concurrency limit reached");
501
+ return this.limitResponse(429, "maxConcurrentRequests", "Too many concurrent requests.");
390
502
  }
391
503
  this.activeApiRequests++;
392
504
  try {
393
- const bytes = new Uint8Array(await request.arrayBuffer());
394
- if (bytes.length > JMAP_SERVER_LIMITS.maxSizeRequest) {
395
- return this.limitResponse(400, 'maxSizeRequest', `The request is larger than ${JMAP_SERVER_LIMITS.maxSizeRequest} bytes.`);
505
+ let bytes;
506
+ try {
507
+ bytes = await this.readRequestBodyBounded(request, this.limits.maxSizeRequest);
508
+ }
509
+ catch (error) {
510
+ if (error instanceof JmapRequestBodyError) {
511
+ if (error.reason === "invalidLength") {
512
+ return this.problemResponse(400, "about:blank", "Invalid Content-Length header.");
513
+ }
514
+ return this.limitResponse(400, "maxSizeRequest", `The request is larger than ${this.limits.maxSizeRequest} bytes.`);
515
+ }
516
+ throw error;
396
517
  }
397
518
  let parsed;
398
519
  try {
399
520
  parsed = JSON.parse(new TextDecoder().decode(bytes));
400
521
  }
401
522
  catch {
402
- return this.problemResponse(400, 'urn:ietf:params:jmap:error:notJSON', 'The request body is not valid JSON.');
523
+ return this.problemResponse(400, "urn:ietf:params:jmap:error:notJSON", "The request body is not valid JSON.");
403
524
  }
404
525
  if (!parsed ||
405
- typeof parsed !== 'object' ||
526
+ typeof parsed !== "object" ||
406
527
  !Array.isArray(parsed.using) ||
407
528
  !Array.isArray(parsed.methodCalls)) {
408
- return this.problemResponse(400, 'urn:ietf:params:jmap:error:notRequest', 'The request body is not a valid JMAP request object.');
529
+ return this.problemResponse(400, "urn:ietf:params:jmap:error:notRequest", "The request body is not a valid JMAP request object.");
409
530
  }
410
531
  const knownCapabilities = new Set([
411
532
  JMAP_CORE_CAPABILITY,
@@ -415,18 +536,19 @@ export class JmapServer {
415
536
  const using = new Set(parsed.using);
416
537
  for (const capability of using) {
417
538
  if (!knownCapabilities.has(capability)) {
418
- return this.problemResponse(400, 'urn:ietf:params:jmap:error:unknownCapability', `The capability "${capability}" is not supported by this server.`);
539
+ return this.problemResponse(400, "urn:ietf:params:jmap:error:unknownCapability", `The capability "${capability}" is not supported by this server.`);
419
540
  }
420
541
  }
421
- if (parsed.methodCalls.length > JMAP_SERVER_LIMITS.maxCallsInRequest) {
422
- return this.limitResponse(400, 'maxCallsInRequest', `The request has more than ${JMAP_SERVER_LIMITS.maxCallsInRequest} method calls.`);
542
+ if (parsed.methodCalls.length > this.limits.maxCallsInRequest) {
543
+ return this.limitResponse(400, "maxCallsInRequest", `The request has more than ${this.limits.maxCallsInRequest} method calls.`);
423
544
  }
424
545
  const createdIds = new Map(Object.entries((parsed.createdIds ?? {})));
425
546
  const methodResponses = [];
426
547
  let mutated = false;
427
548
  for (const call of parsed.methodCalls) {
428
- if (!Array.isArray(call) || typeof call[0] !== 'string' || typeof call[2] !== 'string') {
429
- return this.problemResponse(400, 'urn:ietf:params:jmap:error:notRequest', 'Each method call must be a [name, arguments, callId] tuple.');
549
+ if (!Array.isArray(call) || typeof call[0] !== "string" ||
550
+ typeof call[2] !== "string") {
551
+ return this.problemResponse(400, "urn:ietf:params:jmap:error:notRequest", "Each method call must be a [name, arguments, callId] tuple.");
430
552
  }
431
553
  const [methodName, rawArgs, callId] = call;
432
554
  try {
@@ -442,14 +564,19 @@ export class JmapServer {
442
564
  catch (error) {
443
565
  if (error instanceof JmapServerMethodError) {
444
566
  methodResponses.push([
445
- 'error',
567
+ "error",
446
568
  { type: error.type, description: error.message },
447
569
  callId,
448
570
  ]);
449
571
  }
450
572
  else {
451
- const message = error instanceof Error ? error.message : String(error);
452
- methodResponses.push(['error', { type: 'serverFail', description: message }, callId]);
573
+ const message = error instanceof Error
574
+ ? error.message
575
+ : String(error);
576
+ methodResponses.push(["error", {
577
+ type: "serverFail",
578
+ description: message,
579
+ }, callId]);
453
580
  }
454
581
  }
455
582
  }
@@ -476,30 +603,30 @@ export class JmapServer {
476
603
  resolveBackReferences(args, priorResponses) {
477
604
  const resolved = {};
478
605
  for (const [key, value] of Object.entries(args)) {
479
- if (!key.startsWith('#')) {
606
+ if (!key.startsWith("#")) {
480
607
  resolved[key] = value;
481
608
  continue;
482
609
  }
483
610
  const name = key.slice(1);
484
611
  if (name in args) {
485
- throw new JmapServerMethodError('invalidArguments', `The arguments contain both "${name}" and "#${name}".`);
612
+ throw new JmapServerMethodError("invalidArguments", `The arguments contain both "${name}" and "#${name}".`);
486
613
  }
487
614
  if (!value ||
488
- typeof value !== 'object' ||
489
- typeof value.resultOf !== 'string' ||
490
- typeof value.name !== 'string' ||
491
- typeof value.path !== 'string') {
492
- throw new JmapServerMethodError('invalidResultReference', `"#${name}" is not a valid ResultReference object.`);
615
+ typeof value !== "object" ||
616
+ typeof value.resultOf !== "string" ||
617
+ typeof value.name !== "string" ||
618
+ typeof value.path !== "string") {
619
+ throw new JmapServerMethodError("invalidResultReference", `"#${name}" is not a valid ResultReference object.`);
493
620
  }
494
621
  const source = priorResponses.find((entry) => entry[2] === value.resultOf && entry[0] === value.name);
495
622
  if (!source) {
496
- throw new JmapServerMethodError('invalidResultReference', `No response found for resultOf "${value.resultOf}" and name "${value.name}".`);
623
+ throw new JmapServerMethodError("invalidResultReference", `No response found for resultOf "${value.resultOf}" and name "${value.name}".`);
497
624
  }
498
625
  try {
499
626
  resolved[name] = evalJsonPointer(source[1], value.path);
500
627
  }
501
628
  catch (error) {
502
- throw new JmapServerMethodError('invalidResultReference', error instanceof Error ? error.message : String(error));
629
+ throw new JmapServerMethodError("invalidResultReference", error instanceof Error ? error.message : String(error));
503
630
  }
504
631
  }
505
632
  return resolved;
@@ -509,67 +636,95 @@ export class JmapServer {
509
636
  // ======================
510
637
  async dispatchMethod(account, methodName, args, using, createdIds) {
511
638
  const requiredCapability = {
512
- 'Core/echo': JMAP_CORE_CAPABILITY,
513
- 'Mailbox/get': JMAP_MAIL_CAPABILITY,
514
- 'Mailbox/query': JMAP_MAIL_CAPABILITY,
515
- 'Mailbox/changes': JMAP_MAIL_CAPABILITY,
516
- 'Thread/get': JMAP_MAIL_CAPABILITY,
517
- 'Email/get': JMAP_MAIL_CAPABILITY,
518
- 'Email/query': JMAP_MAIL_CAPABILITY,
519
- 'Email/changes': JMAP_MAIL_CAPABILITY,
520
- 'Email/queryChanges': JMAP_MAIL_CAPABILITY,
521
- 'Email/set': JMAP_MAIL_CAPABILITY,
522
- 'Identity/get': JMAP_SUBMISSION_CAPABILITY,
523
- 'EmailSubmission/set': JMAP_SUBMISSION_CAPABILITY,
639
+ "Core/echo": JMAP_CORE_CAPABILITY,
640
+ "Mailbox/get": JMAP_MAIL_CAPABILITY,
641
+ "Mailbox/query": JMAP_MAIL_CAPABILITY,
642
+ "Mailbox/changes": JMAP_MAIL_CAPABILITY,
643
+ "Thread/get": JMAP_MAIL_CAPABILITY,
644
+ "Email/get": JMAP_MAIL_CAPABILITY,
645
+ "Email/query": JMAP_MAIL_CAPABILITY,
646
+ "Email/changes": JMAP_MAIL_CAPABILITY,
647
+ "Email/queryChanges": JMAP_MAIL_CAPABILITY,
648
+ "Email/set": JMAP_MAIL_CAPABILITY,
649
+ "Identity/get": JMAP_SUBMISSION_CAPABILITY,
650
+ "EmailSubmission/set": JMAP_SUBMISSION_CAPABILITY,
524
651
  };
525
652
  const capability = requiredCapability[methodName];
526
653
  if (!capability) {
527
- throw new JmapServerMethodError('unknownMethod', `Unknown method "${methodName}".`);
654
+ throw new JmapServerMethodError("unknownMethod", `Unknown method "${methodName}".`);
528
655
  }
529
656
  if (!using.has(capability)) {
530
- throw new JmapServerMethodError('unknownMethod', `Method "${methodName}" requires the capability "${capability}" in "using".`);
657
+ throw new JmapServerMethodError("unknownMethod", `Method "${methodName}" requires the capability "${capability}" in "using".`);
531
658
  }
532
- if (methodName !== 'Core/echo') {
659
+ if (methodName !== "Core/echo") {
533
660
  this.requireAccountId(account, args);
534
661
  }
535
662
  switch (methodName) {
536
- case 'Core/echo':
663
+ case "Core/echo":
537
664
  return [{ name: methodName, result: args }];
538
- case 'Mailbox/get':
539
- return [{ name: methodName, result: await this.methodMailboxGet(account, args) }];
540
- case 'Mailbox/query':
541
- return [{ name: methodName, result: await this.methodMailboxQuery(account, args) }];
542
- case 'Mailbox/changes':
543
- return [{ name: methodName, result: await this.methodMailboxChanges(account, args) }];
544
- case 'Thread/get':
545
- return [{ name: methodName, result: await this.methodThreadGet(account, args) }];
546
- case 'Email/get':
547
- return [{ name: methodName, result: await this.methodEmailGet(account, args) }];
548
- case 'Email/query':
549
- return [{ name: methodName, result: await this.methodEmailQuery(account, args) }];
550
- case 'Email/changes':
551
- return [{ name: methodName, result: await this.methodEmailChanges(account, args) }];
552
- case 'Email/queryChanges':
665
+ case "Mailbox/get":
666
+ return [{
667
+ name: methodName,
668
+ result: await this.methodMailboxGet(account, args),
669
+ }];
670
+ case "Mailbox/query":
671
+ return [{
672
+ name: methodName,
673
+ result: await this.methodMailboxQuery(account, args),
674
+ }];
675
+ case "Mailbox/changes":
676
+ return [{
677
+ name: methodName,
678
+ result: await this.methodMailboxChanges(account, args),
679
+ }];
680
+ case "Thread/get":
681
+ return [{
682
+ name: methodName,
683
+ result: await this.methodThreadGet(account, args),
684
+ }];
685
+ case "Email/get":
686
+ return [{
687
+ name: methodName,
688
+ result: await this.methodEmailGet(account, args),
689
+ }];
690
+ case "Email/query":
691
+ return [{
692
+ name: methodName,
693
+ result: await this.methodEmailQuery(account, args),
694
+ }];
695
+ case "Email/changes":
696
+ return [{
697
+ name: methodName,
698
+ result: await this.methodEmailChanges(account, args),
699
+ }];
700
+ case "Email/queryChanges":
553
701
  // Explicitly unsupported in phase 1: clients fall back to Email/query.
554
- throw new JmapServerMethodError('cannotCalculateChanges', 'Email/queryChanges is not supported; re-run the query instead.');
555
- case 'Email/set': {
702
+ throw new JmapServerMethodError("cannotCalculateChanges", "Email/queryChanges is not supported; re-run the query instead.");
703
+ case "Email/set": {
556
704
  const result = await this.methodEmailSet(account, args, createdIds);
557
- return [{ name: methodName, result, mutated: result.newState !== result.oldState }];
558
- }
559
- case 'Identity/get':
560
- return [{ name: methodName, result: await this.methodIdentityGet(account, args) }];
561
- case 'EmailSubmission/set':
705
+ return [{
706
+ name: methodName,
707
+ result,
708
+ mutated: result.newState !== result.oldState,
709
+ }];
710
+ }
711
+ case "Identity/get":
712
+ return [{
713
+ name: methodName,
714
+ result: await this.methodIdentityGet(account, args),
715
+ }];
716
+ case "EmailSubmission/set":
562
717
  return this.methodEmailSubmissionSet(account, args, createdIds);
563
718
  default:
564
- throw new JmapServerMethodError('unknownMethod', `Unknown method "${methodName}".`);
719
+ throw new JmapServerMethodError("unknownMethod", `Unknown method "${methodName}".`);
565
720
  }
566
721
  }
567
722
  requireAccountId(account, args) {
568
- if (typeof args.accountId !== 'string') {
569
- throw new JmapServerMethodError('invalidArguments', 'accountId is required.');
723
+ if (typeof args.accountId !== "string") {
724
+ throw new JmapServerMethodError("invalidArguments", "accountId is required.");
570
725
  }
571
726
  if (args.accountId !== account.accountId) {
572
- throw new JmapServerMethodError('accountNotFound', `Account "${args.accountId}" is not accessible with these credentials.`);
727
+ throw new JmapServerMethodError("accountNotFound", `Account "${args.accountId}" is not accessible with these credentials.`);
573
728
  }
574
729
  }
575
730
  // ======================
@@ -579,10 +734,10 @@ export class JmapServer {
579
734
  let ids = null;
580
735
  if (args.ids !== null && args.ids !== undefined) {
581
736
  if (!Array.isArray(args.ids)) {
582
- throw new JmapServerMethodError('invalidArguments', 'ids must be an array of ids or null.');
737
+ throw new JmapServerMethodError("invalidArguments", "ids must be an array of ids or null.");
583
738
  }
584
- if (args.ids.length > JMAP_SERVER_LIMITS.maxObjectsInGet) {
585
- throw new JmapServerMethodError('requestTooLarge', `ids exceeds maxObjectsInGet (${JMAP_SERVER_LIMITS.maxObjectsInGet}).`);
739
+ if (args.ids.length > this.limits.maxObjectsInGet) {
740
+ throw new JmapServerMethodError("requestTooLarge", `ids exceeds maxObjectsInGet (${this.limits.maxObjectsInGet}).`);
586
741
  }
587
742
  ids = args.ids;
588
743
  }
@@ -605,28 +760,28 @@ export class JmapServer {
605
760
  }
606
761
  async methodMailboxQuery(account, args) {
607
762
  const filter = (args.filter ?? {});
608
- if ('operator' in filter) {
609
- throw new JmapServerMethodError('unsupportedFilter', 'FilterOperator is not supported for Mailbox/query.');
763
+ if ("operator" in filter) {
764
+ throw new JmapServerMethodError("unsupportedFilter", "FilterOperator is not supported for Mailbox/query.");
610
765
  }
611
766
  for (const key of Object.keys(filter)) {
612
- if (!['role', 'name', 'parentId'].includes(key)) {
613
- throw new JmapServerMethodError('unsupportedFilter', `Mailbox filter condition "${key}" is not supported.`);
767
+ if (!["role", "name", "parentId"].includes(key)) {
768
+ throw new JmapServerMethodError("unsupportedFilter", `Mailbox filter condition "${key}" is not supported.`);
614
769
  }
615
770
  }
616
771
  for (const comparator of (args.sort ?? [])) {
617
- if (!['name', 'sortOrder'].includes(comparator.property)) {
618
- throw new JmapServerMethodError('unsupportedSort', `Mailbox sort property "${comparator.property}" is not supported.`);
772
+ if (!["name", "sortOrder"].includes(comparator.property)) {
773
+ throw new JmapServerMethodError("unsupportedSort", `Mailbox sort property "${comparator.property}" is not supported.`);
619
774
  }
620
775
  }
621
776
  const result = await this.backend.getMailboxes(account.accountId, null);
622
777
  let mailboxes = result.list;
623
- if (typeof filter.role === 'string') {
778
+ if (typeof filter.role === "string") {
624
779
  mailboxes = mailboxes.filter((mailbox) => mailbox.role === filter.role);
625
780
  }
626
- if (typeof filter.name === 'string') {
781
+ if (typeof filter.name === "string") {
627
782
  mailboxes = mailboxes.filter((mailbox) => mailbox.name === filter.name);
628
783
  }
629
- if ('parentId' in filter) {
784
+ if ("parentId" in filter) {
630
785
  mailboxes = mailboxes.filter((mailbox) => mailbox.parentId === filter.parentId);
631
786
  }
632
787
  const comparators = (args.sort ?? []);
@@ -649,7 +804,7 @@ export class JmapServer {
649
804
  }
650
805
  const position = this.validatePosition(args);
651
806
  let ids = mailboxes.map((mailbox) => mailbox.id).slice(position);
652
- if (typeof args.limit === 'number') {
807
+ if (typeof args.limit === "number") {
653
808
  ids = ids.slice(0, args.limit);
654
809
  }
655
810
  const response = {
@@ -668,7 +823,7 @@ export class JmapServer {
668
823
  const { sinceState, maxChanges } = this.validateChangesArgs(args);
669
824
  const changes = await this.backend.getMailboxChanges(account.accountId, sinceState, maxChanges);
670
825
  if (!changes) {
671
- throw new JmapServerMethodError('cannotCalculateChanges', `Cannot calculate mailbox changes since state "${sinceState}".`);
826
+ throw new JmapServerMethodError("cannotCalculateChanges", `Cannot calculate mailbox changes since state "${sinceState}".`);
672
827
  }
673
828
  return { accountId: account.accountId, ...changes };
674
829
  }
@@ -677,10 +832,10 @@ export class JmapServer {
677
832
  // ======================
678
833
  async methodThreadGet(account, args) {
679
834
  if (!Array.isArray(args.ids)) {
680
- throw new JmapServerMethodError('invalidArguments', 'Thread/get requires an ids array.');
835
+ throw new JmapServerMethodError("invalidArguments", "Thread/get requires an ids array.");
681
836
  }
682
- if (args.ids.length > JMAP_SERVER_LIMITS.maxObjectsInGet) {
683
- throw new JmapServerMethodError('requestTooLarge', `ids exceeds maxObjectsInGet (${JMAP_SERVER_LIMITS.maxObjectsInGet}).`);
837
+ if (args.ids.length > this.limits.maxObjectsInGet) {
838
+ throw new JmapServerMethodError("requestTooLarge", `ids exceeds maxObjectsInGet (${this.limits.maxObjectsInGet}).`);
684
839
  }
685
840
  // Result-reference chains like Email/get -> /list/*/threadId commonly
686
841
  // contain duplicates; deduplicate so each thread is returned once.
@@ -699,20 +854,20 @@ export class JmapServer {
699
854
  async methodEmailGet(account, args) {
700
855
  if (args.ids === null || args.ids === undefined) {
701
856
  // RFC 8621 allows rejecting "fetch all" for the potentially huge Email type.
702
- throw new JmapServerMethodError('requestTooLarge', 'Email/get requires an explicit ids array on this server.');
857
+ throw new JmapServerMethodError("requestTooLarge", "Email/get requires an explicit ids array on this server.");
703
858
  }
704
859
  if (!Array.isArray(args.ids)) {
705
- throw new JmapServerMethodError('invalidArguments', 'Email/get requires an ids array.');
860
+ throw new JmapServerMethodError("invalidArguments", "Email/get requires an ids array.");
706
861
  }
707
- if (args.ids.length > JMAP_SERVER_LIMITS.maxObjectsInGet) {
708
- throw new JmapServerMethodError('requestTooLarge', `ids exceeds maxObjectsInGet (${JMAP_SERVER_LIMITS.maxObjectsInGet}).`);
862
+ if (args.ids.length > this.limits.maxObjectsInGet) {
863
+ throw new JmapServerMethodError("requestTooLarge", `ids exceeds maxObjectsInGet (${this.limits.maxObjectsInGet}).`);
709
864
  }
710
865
  const properties = this.validateProperties(args.properties, KNOWN_EMAIL_PROPERTIES);
711
866
  const result = await this.backend.getEmails(account.accountId, args.ids, properties);
712
867
  const effectiveProperties = properties ?? DEFAULT_EMAIL_PROPERTIES;
713
868
  const list = result.list.map((record) => {
714
869
  const projected = this.projectObject(record, effectiveProperties);
715
- if (effectiveProperties.includes('bodyValues')) {
870
+ if (effectiveProperties.includes("bodyValues")) {
716
871
  projected.bodyValues = this.buildBodyValues(record, args);
717
872
  }
718
873
  return projected;
@@ -746,7 +901,7 @@ export class JmapServer {
746
901
  }
747
902
  }
748
903
  }
749
- const maxBytes = typeof args.maxBodyValueBytes === 'number' && args.maxBodyValueBytes > 0
904
+ const maxBytes = typeof args.maxBodyValueBytes === "number" && args.maxBodyValueBytes > 0
750
905
  ? args.maxBodyValueBytes
751
906
  : null;
752
907
  const result = {};
@@ -770,29 +925,29 @@ export class JmapServer {
770
925
  }
771
926
  async methodEmailQuery(account, args) {
772
927
  const filter = (args.filter ?? {});
773
- if ('operator' in filter) {
774
- throw new JmapServerMethodError('unsupportedFilter', 'FilterOperator is not supported; use a flat FilterCondition.');
928
+ if ("operator" in filter) {
929
+ throw new JmapServerMethodError("unsupportedFilter", "FilterOperator is not supported; use a flat FilterCondition.");
775
930
  }
776
931
  for (const key of Object.keys(filter)) {
777
932
  if (!SUPPORTED_EMAIL_FILTER_KEYS.has(key)) {
778
- throw new JmapServerMethodError('unsupportedFilter', `Email filter condition "${key}" is not supported.`);
933
+ throw new JmapServerMethodError("unsupportedFilter", `Email filter condition "${key}" is not supported.`);
779
934
  }
780
935
  }
781
936
  const sort = (args.sort ?? []);
782
937
  for (const comparator of sort) {
783
- if (comparator.property !== 'receivedAt') {
784
- throw new JmapServerMethodError('unsupportedSort', `Email sort property "${comparator.property}" is not supported.`);
938
+ if (comparator.property !== "receivedAt") {
939
+ throw new JmapServerMethodError("unsupportedSort", `Email sort property "${comparator.property}" is not supported.`);
785
940
  }
786
941
  }
787
942
  if (args.anchor !== undefined && args.anchor !== null) {
788
- throw new JmapServerMethodError('invalidArguments', 'anchor is not supported.');
943
+ throw new JmapServerMethodError("invalidArguments", "anchor is not supported.");
789
944
  }
790
945
  const position = this.validatePosition(args);
791
946
  const result = await this.backend.queryEmails(account.accountId, {
792
947
  filter: filter,
793
948
  sort: sort,
794
949
  position,
795
- limit: typeof args.limit === 'number' ? args.limit : null,
950
+ limit: typeof args.limit === "number" ? args.limit : null,
796
951
  calculateTotal: args.calculateTotal === true,
797
952
  });
798
953
  const response = {
@@ -811,7 +966,7 @@ export class JmapServer {
811
966
  const { sinceState, maxChanges } = this.validateChangesArgs(args);
812
967
  const changes = await this.backend.getEmailChanges(account.accountId, sinceState, maxChanges);
813
968
  if (!changes) {
814
- throw new JmapServerMethodError('cannotCalculateChanges', `Cannot calculate changes since state "${sinceState}".`);
969
+ throw new JmapServerMethodError("cannotCalculateChanges", `Cannot calculate changes since state "${sinceState}".`);
815
970
  }
816
971
  return { accountId: account.accountId, ...changes };
817
972
  }
@@ -820,13 +975,13 @@ export class JmapServer {
820
975
  const updateEntries = Object.entries((args.update ?? {}));
821
976
  const destroyIds = (args.destroy ?? []);
822
977
  if (createEntries.length + updateEntries.length + destroyIds.length >
823
- JMAP_SERVER_LIMITS.maxObjectsInSet) {
824
- throw new JmapServerMethodError('requestTooLarge', `The set request exceeds maxObjectsInSet (${JMAP_SERVER_LIMITS.maxObjectsInSet}).`);
978
+ this.limits.maxObjectsInSet) {
979
+ throw new JmapServerMethodError("requestTooLarge", `The set request exceeds maxObjectsInSet (${this.limits.maxObjectsInSet}).`);
825
980
  }
826
- if (typeof args.ifInState === 'string') {
981
+ if (typeof args.ifInState === "string") {
827
982
  const current = await this.backend.getEmails(account.accountId, []);
828
983
  if (current.state !== args.ifInState) {
829
- throw new JmapServerMethodError('stateMismatch', `ifInState "${args.ifInState}" does not match the current state "${current.state}".`);
984
+ throw new JmapServerMethodError("stateMismatch", `ifInState "${args.ifInState}" does not match the current state "${current.state}".`);
830
985
  }
831
986
  }
832
987
  const backendRequest = {};
@@ -844,10 +999,9 @@ export class JmapServer {
844
999
  backendRequest.update[id] = this.parseEmailUpdatePatch(patch);
845
1000
  }
846
1001
  catch (error) {
847
- notUpdatedEarly[id] =
848
- error instanceof JmapServerMethodError
849
- ? { type: error.type, description: error.message }
850
- : { type: 'invalidPatch', description: String(error) };
1002
+ notUpdatedEarly[id] = error instanceof JmapServerMethodError
1003
+ ? { type: error.type, description: error.message }
1004
+ : { type: "invalidPatch", description: String(error) };
851
1005
  }
852
1006
  }
853
1007
  }
@@ -889,37 +1043,42 @@ export class JmapServer {
889
1043
  */
890
1044
  parseEmailUpdatePatch(patch) {
891
1045
  const update = {};
892
- const unescape = (token) => token.replaceAll('~1', '/').replaceAll('~0', '~');
1046
+ const unescape = (token) => token.replaceAll("~1", "/").replaceAll("~0", "~");
893
1047
  for (const [path, value] of Object.entries(patch)) {
894
- if (path === 'keywords' || path === 'mailboxIds') {
895
- if (value === null || typeof value !== 'object' || Array.isArray(value)) {
896
- throw new JmapServerMethodError('invalidProperties', `"${path}" must be an object.`);
1048
+ if (path === "keywords" || path === "mailboxIds") {
1049
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
1050
+ throw new JmapServerMethodError("invalidProperties", `"${path}" must be an object.`);
897
1051
  }
898
1052
  const normalized = {};
899
1053
  for (const [key, entryValue] of Object.entries(value)) {
900
1054
  if (entryValue !== true) {
901
- throw new JmapServerMethodError('invalidProperties', `Values in "${path}" must be true; remove entries instead of setting them false.`);
1055
+ throw new JmapServerMethodError("invalidProperties", `Values in "${path}" must be true; remove entries instead of setting them false.`);
902
1056
  }
903
1057
  normalized[key] = true;
904
1058
  }
905
1059
  update[path] = normalized;
906
1060
  continue;
907
1061
  }
908
- const slashIndex = path.indexOf('/');
1062
+ const slashIndex = path.indexOf("/");
909
1063
  if (slashIndex === -1) {
910
- throw new JmapServerMethodError('invalidProperties', `Email property "${path}" is immutable or unknown.`);
1064
+ throw new JmapServerMethodError("invalidProperties", `Email property "${path}" is immutable or unknown.`);
911
1065
  }
912
1066
  const property = path.slice(0, slashIndex);
913
1067
  const rest = path.slice(slashIndex + 1);
914
- if ((property !== 'keywords' && property !== 'mailboxIds') || rest.includes('/') || !rest) {
915
- throw new JmapServerMethodError('invalidPatch', `Unsupported patch path "${path}".`);
1068
+ if ((property !== "keywords" && property !== "mailboxIds") ||
1069
+ rest.includes("/") || !rest) {
1070
+ throw new JmapServerMethodError("invalidPatch", `Unsupported patch path "${path}".`);
916
1071
  }
917
1072
  const key = unescape(rest);
918
- const normalizedValue = value === true ? true : value === null || value === false ? null : undefined;
1073
+ const normalizedValue = value === true
1074
+ ? true
1075
+ : value === null || value === false
1076
+ ? null
1077
+ : undefined;
919
1078
  if (normalizedValue === undefined) {
920
- throw new JmapServerMethodError('invalidPatch', `Patch value for "${path}" must be true or null.`);
1079
+ throw new JmapServerMethodError("invalidPatch", `Patch value for "${path}" must be true or null.`);
921
1080
  }
922
- if (property === 'keywords') {
1081
+ if (property === "keywords") {
923
1082
  update.keywordsPatch = update.keywordsPatch ?? {};
924
1083
  update.keywordsPatch[key] = normalizedValue;
925
1084
  }
@@ -929,10 +1088,10 @@ export class JmapServer {
929
1088
  }
930
1089
  }
931
1090
  if (update.keywords && update.keywordsPatch) {
932
- throw new JmapServerMethodError('invalidPatch', 'A patch must not set "keywords" and patch "keywords/..." at the same time.');
1091
+ throw new JmapServerMethodError("invalidPatch", 'A patch must not set "keywords" and patch "keywords/..." at the same time.');
933
1092
  }
934
1093
  if (update.mailboxIds && update.mailboxIdsPatch) {
935
- throw new JmapServerMethodError('invalidPatch', 'A patch must not set "mailboxIds" and patch "mailboxIds/..." at the same time.');
1094
+ throw new JmapServerMethodError("invalidPatch", 'A patch must not set "mailboxIds" and patch "mailboxIds/..." at the same time.');
936
1095
  }
937
1096
  return update;
938
1097
  }
@@ -952,7 +1111,12 @@ export class JmapServer {
952
1111
  }
953
1112
  }
954
1113
  }
955
- return { accountId: account.accountId, state: result.state, list, notFound };
1114
+ return {
1115
+ accountId: account.accountId,
1116
+ state: result.state,
1117
+ list,
1118
+ notFound,
1119
+ };
956
1120
  }
957
1121
  async methodEmailSubmissionSet(account, args, createdIds) {
958
1122
  const created = {};
@@ -964,22 +1128,24 @@ export class JmapServer {
964
1128
  const identitiesResult = await this.backend.getIdentities(account.accountId);
965
1129
  for (const [creationId, spec] of Object.entries((args.create ?? {}))) {
966
1130
  let emailId = spec.emailId;
967
- if (typeof emailId === 'string' && emailId.startsWith('#')) {
1131
+ if (typeof emailId === "string" && emailId.startsWith("#")) {
968
1132
  const resolved = createdIds.get(emailId.slice(1));
969
1133
  if (!resolved) {
970
1134
  notCreated[creationId] = {
971
- type: 'invalidProperties',
1135
+ type: "invalidProperties",
972
1136
  description: `Unknown creation id reference "${emailId}".`,
973
1137
  };
974
1138
  continue;
975
1139
  }
976
1140
  emailId = resolved;
977
1141
  }
978
- const emailResult = await this.backend.getEmails(account.accountId, [emailId]);
1142
+ const emailResult = await this.backend.getEmails(account.accountId, [
1143
+ emailId,
1144
+ ]);
979
1145
  const email = emailResult.list[0];
980
1146
  if (!email) {
981
1147
  notCreated[creationId] = {
982
- type: 'invalidProperties',
1148
+ type: "invalidProperties",
983
1149
  description: `Email "${emailId}" does not exist.`,
984
1150
  };
985
1151
  continue;
@@ -987,7 +1153,7 @@ export class JmapServer {
987
1153
  const identity = identitiesResult.list.find((candidate) => candidate.id === spec.identityId);
988
1154
  if (!identity) {
989
1155
  notCreated[creationId] = {
990
- type: 'invalidProperties',
1156
+ type: "invalidProperties",
991
1157
  description: `Identity "${spec.identityId}" does not exist.`,
992
1158
  };
993
1159
  continue;
@@ -995,15 +1161,15 @@ export class JmapServer {
995
1161
  const envelope = this.resolveEnvelope(spec.envelope, identity.email, email);
996
1162
  if (!envelope.rcptTo.length) {
997
1163
  notCreated[creationId] = {
998
- type: 'noRecipients',
999
- description: 'The email has no to/cc/bcc recipients and no envelope was given.',
1164
+ type: "noRecipients",
1165
+ description: "The email has no to/cc/bcc recipients and no envelope was given.",
1000
1166
  };
1001
1167
  continue;
1002
1168
  }
1003
1169
  const blob = await this.backend.getBlob(account.accountId, email.blobId);
1004
1170
  if (!blob) {
1005
1171
  notCreated[creationId] = {
1006
- type: 'invalidProperties',
1172
+ type: "invalidProperties",
1007
1173
  description: `Raw message blob "${email.blobId}" does not exist.`,
1008
1174
  };
1009
1175
  continue;
@@ -1015,7 +1181,10 @@ export class JmapServer {
1015
1181
  envelope,
1016
1182
  message: blob.data,
1017
1183
  });
1018
- createdSubmissions.set(creationId, { submissionId: submission.id, emailId });
1184
+ createdSubmissions.set(creationId, {
1185
+ submissionId: submission.id,
1186
+ emailId,
1187
+ });
1019
1188
  created[creationId] = {
1020
1189
  id: submission.id,
1021
1190
  undoStatus: submission.undoStatus,
@@ -1024,30 +1193,30 @@ export class JmapServer {
1024
1193
  }
1025
1194
  catch (error) {
1026
1195
  notCreated[creationId] = {
1027
- type: 'forbiddenToSend',
1196
+ type: "forbiddenToSend",
1028
1197
  description: error instanceof Error ? error.message : String(error),
1029
1198
  };
1030
1199
  }
1031
1200
  }
1032
1201
  for (const id of Object.keys((args.update ?? {}))) {
1033
1202
  notUpdated[id] = {
1034
- type: 'forbidden',
1035
- description: 'EmailSubmission updates are not supported.',
1203
+ type: "forbidden",
1204
+ description: "EmailSubmission updates are not supported.",
1036
1205
  };
1037
1206
  }
1038
1207
  for (const id of (args.destroy ?? [])) {
1039
1208
  notDestroyed[id] = {
1040
- type: 'forbidden',
1041
- description: 'EmailSubmission destroys are not supported.',
1209
+ type: "forbidden",
1210
+ description: "EmailSubmission destroys are not supported.",
1042
1211
  };
1043
1212
  }
1044
1213
  const responses = [
1045
1214
  {
1046
- name: 'EmailSubmission/set',
1215
+ name: "EmailSubmission/set",
1047
1216
  result: {
1048
1217
  accountId: account.accountId,
1049
1218
  oldState: null,
1050
- newState: '0',
1219
+ newState: "0",
1051
1220
  created,
1052
1221
  notCreated,
1053
1222
  updated: {},
@@ -1062,7 +1231,7 @@ export class JmapServer {
1062
1231
  // implicit Email/set for successfully created submissions and append its
1063
1232
  // response after the EmailSubmission/set response.
1064
1233
  const resolveSubmissionRef = (reference) => {
1065
- if (reference.startsWith('#')) {
1234
+ if (reference.startsWith("#")) {
1066
1235
  return createdSubmissions.get(reference.slice(1)) ?? null;
1067
1236
  }
1068
1237
  for (const entry of createdSubmissions.values()) {
@@ -1074,7 +1243,7 @@ export class JmapServer {
1074
1243
  };
1075
1244
  const implicitSet = { accountId: account.accountId };
1076
1245
  let hasImplicitSet = false;
1077
- if (args.onSuccessUpdateEmail && typeof args.onSuccessUpdateEmail === 'object') {
1246
+ if (args.onSuccessUpdateEmail && typeof args.onSuccessUpdateEmail === "object") {
1078
1247
  const update = {};
1079
1248
  for (const [reference, patch] of Object.entries(args.onSuccessUpdateEmail)) {
1080
1249
  const entry = resolveSubmissionRef(reference);
@@ -1099,7 +1268,7 @@ export class JmapServer {
1099
1268
  if (hasImplicitSet) {
1100
1269
  const result = await this.methodEmailSet(account, implicitSet, createdIds);
1101
1270
  responses.push({
1102
- name: 'Email/set',
1271
+ name: "Email/set",
1103
1272
  result,
1104
1273
  mutated: result.newState !== result.oldState,
1105
1274
  });
@@ -1109,13 +1278,13 @@ export class JmapServer {
1109
1278
  /** Uses the client-provided envelope or derives it from the email's addresses. */
1110
1279
  resolveEnvelope(specEnvelope, identityEmail, email) {
1111
1280
  if (specEnvelope &&
1112
- typeof specEnvelope === 'object' &&
1281
+ typeof specEnvelope === "object" &&
1113
1282
  specEnvelope.mailFrom?.email &&
1114
1283
  Array.isArray(specEnvelope.rcptTo)) {
1115
1284
  return {
1116
1285
  mailFrom: { email: String(specEnvelope.mailFrom.email) },
1117
1286
  rcptTo: specEnvelope.rcptTo
1118
- .filter((recipient) => typeof recipient?.email === 'string')
1287
+ .filter((recipient) => typeof recipient?.email === "string")
1119
1288
  .map((recipient) => ({ email: recipient.email })),
1120
1289
  };
1121
1290
  }
@@ -1133,40 +1302,310 @@ export class JmapServer {
1133
1302
  // ======================
1134
1303
  // upload + download
1135
1304
  // ======================
1136
- async handleUpload(account, pathname, request) {
1137
- const segments = pathname.split('/').filter((segment) => segment.length > 0);
1138
- const accountId = decodeURIComponent(segments[2] ?? '');
1305
+ async cancelRequestBody(request, reason) {
1306
+ try {
1307
+ if (request.body && !request.body.locked) {
1308
+ await request.body.cancel(reason);
1309
+ }
1310
+ }
1311
+ catch {
1312
+ // The runtime or peer may already have closed the transport stream.
1313
+ }
1314
+ }
1315
+ async readRequestBodyBounded(request, maxBytes) {
1316
+ const declaredLength = request.headers.get("content-length");
1317
+ if (declaredLength !== null) {
1318
+ if (!/^\d+$/.test(declaredLength) ||
1319
+ !Number.isSafeInteger(Number(declaredLength))) {
1320
+ await this.cancelRequestBody(request, "invalid content length");
1321
+ throw new JmapRequestBodyError("invalidLength");
1322
+ }
1323
+ if (Number(declaredLength) > maxBytes) {
1324
+ await this.cancelRequestBody(request, "request body too large");
1325
+ throw new JmapRequestBodyError("tooLarge");
1326
+ }
1327
+ }
1328
+ if (!request.body) {
1329
+ return new Uint8Array();
1330
+ }
1331
+ const reader = request.body.getReader();
1332
+ const chunks = [];
1333
+ let total = 0;
1334
+ try {
1335
+ while (true) {
1336
+ const { done, value } = await reader.read();
1337
+ if (done)
1338
+ break;
1339
+ total += value.byteLength;
1340
+ if (total > maxBytes) {
1341
+ await reader.cancel("request body too large");
1342
+ throw new JmapRequestBodyError("tooLarge");
1343
+ }
1344
+ chunks.push(value);
1345
+ }
1346
+ }
1347
+ finally {
1348
+ reader.releaseLock();
1349
+ }
1350
+ const data = new Uint8Array(total);
1351
+ let offset = 0;
1352
+ for (const chunk of chunks) {
1353
+ data.set(chunk, offset);
1354
+ offset += chunk.byteLength;
1355
+ }
1356
+ return data;
1357
+ }
1358
+ createExactUploadBody(request, expectedSize) {
1359
+ const abortController = new AbortController();
1360
+ let reader = null;
1361
+ let bytesRead = 0;
1362
+ let complete = false;
1363
+ let cancelled = false;
1364
+ const cancel = async (reason) => {
1365
+ if (cancelled || complete)
1366
+ return;
1367
+ cancelled = true;
1368
+ abortController.abort(reason);
1369
+ try {
1370
+ if (reader) {
1371
+ await reader.cancel(reason);
1372
+ }
1373
+ else if (request.body && !request.body.locked) {
1374
+ await request.body.cancel(reason);
1375
+ }
1376
+ }
1377
+ catch {
1378
+ // The peer or consumer may already have closed the stream.
1379
+ }
1380
+ };
1381
+ const onRequestAbort = () => {
1382
+ void cancel(request.signal.reason ?? new Error("Request aborted."));
1383
+ };
1384
+ request.signal.addEventListener("abort", onRequestAbort, { once: true });
1385
+ if (request.signal.aborted)
1386
+ onRequestAbort();
1387
+ const stream = new ReadableStream({
1388
+ async pull(controller) {
1389
+ if (cancelled) {
1390
+ controller.error(abortController.signal.reason ?? new Error("Upload cancelled."));
1391
+ return;
1392
+ }
1393
+ if (!request.body) {
1394
+ if (expectedSize === 0) {
1395
+ complete = true;
1396
+ controller.close();
1397
+ }
1398
+ else {
1399
+ const error = new JmapRequestBodyError("lengthMismatch");
1400
+ abortController.abort(error);
1401
+ controller.error(error);
1402
+ }
1403
+ return;
1404
+ }
1405
+ reader ??= request.body.getReader();
1406
+ const { done, value } = await reader.read();
1407
+ if (done) {
1408
+ if (bytesRead !== expectedSize) {
1409
+ const error = new JmapRequestBodyError("lengthMismatch");
1410
+ abortController.abort(error);
1411
+ controller.error(error);
1412
+ return;
1413
+ }
1414
+ complete = true;
1415
+ controller.close();
1416
+ return;
1417
+ }
1418
+ bytesRead += value.byteLength;
1419
+ if (bytesRead > expectedSize) {
1420
+ const error = new JmapRequestBodyError("lengthMismatch");
1421
+ await cancel(error);
1422
+ controller.error(error);
1423
+ return;
1424
+ }
1425
+ controller.enqueue(value);
1426
+ },
1427
+ cancel,
1428
+ }, { highWaterMark: 0 });
1429
+ return {
1430
+ stream,
1431
+ signal: abortController.signal,
1432
+ isComplete: () => complete,
1433
+ cancel,
1434
+ dispose: () => request.signal.removeEventListener("abort", onRequestAbort),
1435
+ };
1436
+ }
1437
+ mappedUploadErrorResponse(error) {
1438
+ const problem = this.options.mapUploadError?.(error);
1439
+ if (!problem)
1440
+ return null;
1441
+ if (!Number.isInteger(problem.status) || problem.status < 400 ||
1442
+ problem.status > 599 ||
1443
+ !problem.detail) {
1444
+ throw new Error("mapUploadError returned an invalid upload problem.");
1445
+ }
1446
+ const body = {
1447
+ type: problem.type ?? "about:blank",
1448
+ status: problem.status,
1449
+ detail: problem.detail,
1450
+ ...(problem.limit ? { limit: problem.limit } : {}),
1451
+ };
1452
+ const headers = {
1453
+ "content-type": "application/problem+json",
1454
+ };
1455
+ if (problem.retryAfterSeconds !== undefined) {
1456
+ headers["retry-after"] = String(problem.retryAfterSeconds);
1457
+ }
1458
+ return new Response(JSON.stringify(body), {
1459
+ status: problem.status,
1460
+ headers,
1461
+ });
1462
+ }
1463
+ requestBodyErrorResponse(error, limit) {
1464
+ if (error.reason === "invalidLength") {
1465
+ return this.problemResponse(400, "about:blank", "Invalid Content-Length header.");
1466
+ }
1467
+ if (error.reason === "lengthMismatch") {
1468
+ return this.problemResponse(400, "about:blank", "The request body does not match Content-Length.");
1469
+ }
1470
+ const maximum = limit === "maxSizeUpload"
1471
+ ? this.limits.maxSizeUpload
1472
+ : this.limits.maxSizeRequest;
1473
+ return this.limitResponse(400, limit, `The request is larger than ${maximum} bytes.`);
1474
+ }
1475
+ async handleStreamingUpload(account, request, type) {
1476
+ const contentLength = request.headers.get("content-length");
1477
+ if (contentLength === null) {
1478
+ await this.cancelRequestBody(request, "content length required");
1479
+ return this.problemResponse(411, "about:blank", "Content-Length is required.");
1480
+ }
1481
+ if (!/^\d+$/.test(contentLength) ||
1482
+ !Number.isSafeInteger(Number(contentLength))) {
1483
+ await this.cancelRequestBody(request, "invalid content length");
1484
+ return this.problemResponse(400, "about:blank", "Invalid Content-Length header.");
1485
+ }
1486
+ const declaredSize = Number(contentLength);
1487
+ if (declaredSize > this.limits.maxSizeUpload) {
1488
+ await this.cancelRequestBody(request, "request body too large");
1489
+ return this.limitResponse(400, "maxSizeUpload", `The upload is larger than ${this.limits.maxSizeUpload} bytes.`);
1490
+ }
1491
+ if (!request.body && declaredSize !== 0) {
1492
+ return this.problemResponse(400, "about:blank", "The request body does not match Content-Length.");
1493
+ }
1494
+ const body = this.createExactUploadBody(request, declaredSize);
1495
+ const upload = {
1496
+ stream: body.stream,
1497
+ size: declaredSize,
1498
+ type,
1499
+ signal: body.signal,
1500
+ };
1501
+ try {
1502
+ const result = await this.backend.uploadBlobStream(account.accountId, upload);
1503
+ if (!body.isComplete()) {
1504
+ await body.cancel(new JmapRequestBodyError("lengthMismatch"));
1505
+ return this.problemResponse(400, "about:blank", "The upload backend did not consume the exact request body.");
1506
+ }
1507
+ if (result.size !== declaredSize) {
1508
+ throw new Error(`Upload backend reported ${result.size} bytes for a ${declaredSize}-byte request.`);
1509
+ }
1510
+ return this.jsonResponse(200, {
1511
+ accountId: account.accountId,
1512
+ blobId: result.blobId,
1513
+ type,
1514
+ size: result.size,
1515
+ });
1516
+ }
1517
+ catch (error) {
1518
+ await body.cancel(error);
1519
+ if (error instanceof JmapRequestBodyError) {
1520
+ return this.requestBodyErrorResponse(error, "maxSizeUpload");
1521
+ }
1522
+ const mapped = this.mappedUploadErrorResponse(error);
1523
+ if (mapped)
1524
+ return mapped;
1525
+ throw error;
1526
+ }
1527
+ finally {
1528
+ body.dispose();
1529
+ }
1530
+ }
1531
+ async handleUpload(account, principal, pathname, request) {
1532
+ const segments = pathname.split("/").filter((segment) => segment.length > 0);
1533
+ const accountId = decodeURIComponent(segments[2] ?? "");
1139
1534
  if (accountId !== account.accountId) {
1140
- return this.problemResponse(404, 'about:blank', 'Unknown account');
1535
+ await this.cancelRequestBody(request, "unknown account");
1536
+ return this.problemResponse(404, "about:blank", "Unknown account");
1537
+ }
1538
+ const principalUploads = this.activeUploadsByPrincipal.get(principal.username) ?? 0;
1539
+ if (principalUploads >= this.limits.maxConcurrentUpload ||
1540
+ this.activeUploadRequests >= this.maxConcurrentUploadServer) {
1541
+ await this.cancelRequestBody(request, "upload concurrency limit reached");
1542
+ return this.limitResponse(429, "maxConcurrentUpload", "Too many concurrent uploads.");
1543
+ }
1544
+ this.activeUploadRequests++;
1545
+ this.activeUploadsByPrincipal.set(principal.username, principalUploads + 1);
1546
+ try {
1547
+ const type = request.headers.get("content-type") ??
1548
+ "application/octet-stream";
1549
+ if (typeof this.backend.uploadBlobStream === "function") {
1550
+ return await this.handleStreamingUpload(account, request, type);
1551
+ }
1552
+ let data;
1553
+ try {
1554
+ data = await this.readRequestBodyBounded(request, this.limits.maxSizeUpload);
1555
+ }
1556
+ catch (error) {
1557
+ if (error instanceof JmapRequestBodyError) {
1558
+ return this.requestBodyErrorResponse(error, "maxSizeUpload");
1559
+ }
1560
+ throw error;
1561
+ }
1562
+ try {
1563
+ const { blobId, size } = await this.backend.uploadBlob(account.accountId, data, type);
1564
+ return this.jsonResponse(200, {
1565
+ accountId: account.accountId,
1566
+ blobId,
1567
+ type,
1568
+ size,
1569
+ });
1570
+ }
1571
+ catch (error) {
1572
+ const mapped = this.mappedUploadErrorResponse(error);
1573
+ if (mapped)
1574
+ return mapped;
1575
+ throw error;
1576
+ }
1141
1577
  }
1142
- const data = new Uint8Array(await request.arrayBuffer());
1143
- if (data.length > JMAP_SERVER_LIMITS.maxSizeUpload) {
1144
- return this.limitResponse(400, 'maxSizeUpload', `The upload is larger than ${JMAP_SERVER_LIMITS.maxSizeUpload} bytes.`);
1578
+ finally {
1579
+ this.activeUploadRequests--;
1580
+ const remainingPrincipalUploads = (this.activeUploadsByPrincipal.get(principal.username) ?? 1) - 1;
1581
+ if (remainingPrincipalUploads <= 0) {
1582
+ this.activeUploadsByPrincipal.delete(principal.username);
1583
+ }
1584
+ else {
1585
+ this.activeUploadsByPrincipal.set(principal.username, remainingPrincipalUploads);
1586
+ }
1145
1587
  }
1146
- const type = request.headers.get('content-type') ?? 'application/octet-stream';
1147
- const { blobId, size } = await this.backend.uploadBlob(account.accountId, data, type);
1148
- return this.jsonResponse(200, { accountId: account.accountId, blobId, type, size });
1149
1588
  }
1150
1589
  async handleDownload(account, pathname, url) {
1151
1590
  // /jmap/download/{accountId}/{blobId}/{name}
1152
- const segments = pathname.split('/').filter((segment) => segment.length > 0);
1153
- const accountId = decodeURIComponent(segments[2] ?? '');
1154
- const blobId = decodeURIComponent(segments[3] ?? '');
1155
- const name = decodeURIComponent(segments[4] ?? 'blob');
1591
+ const segments = pathname.split("/").filter((segment) => segment.length > 0);
1592
+ const accountId = decodeURIComponent(segments[2] ?? "");
1593
+ const blobId = decodeURIComponent(segments[3] ?? "");
1594
+ const name = decodeURIComponent(segments[4] ?? "blob");
1156
1595
  if (accountId !== account.accountId) {
1157
- return this.problemResponse(404, 'about:blank', 'Unknown account');
1596
+ return this.problemResponse(404, "about:blank", "Unknown account");
1158
1597
  }
1159
1598
  const blob = await this.backend.getBlob(account.accountId, blobId);
1160
1599
  if (!blob) {
1161
- return this.problemResponse(404, 'about:blank', 'Unknown blob');
1600
+ return this.problemResponse(404, "about:blank", "Unknown blob");
1162
1601
  }
1163
- const type = url.searchParams.get('type') ?? blob.type;
1602
+ const type = url.searchParams.get("type") ?? blob.type;
1164
1603
  return new Response(asBodyBytes(blob.data), {
1165
1604
  status: 200,
1166
1605
  headers: {
1167
- 'content-type': type,
1168
- 'content-length': String(blob.data.length),
1169
- 'content-disposition': `attachment; filename="${name.replaceAll('"', '')}"`,
1606
+ "content-type": type,
1607
+ "content-length": String(blob.data.length),
1608
+ "content-disposition": `attachment; filename="${name.replaceAll('"', "")}"`,
1170
1609
  },
1171
1610
  });
1172
1611
  }
@@ -1174,16 +1613,16 @@ export class JmapServer {
1174
1613
  // event source (SSE)
1175
1614
  // ======================
1176
1615
  handleEventSource(account, url) {
1177
- const typesParam = url.searchParams.get('types') ?? '*';
1178
- const types = typesParam === '*' || typesParam === ''
1179
- ? null
1180
- : new Set(typesParam
1181
- .split(',')
1182
- .map((entry) => entry.trim())
1183
- .filter((entry) => entry.length > 0));
1184
- const closeAfterState = url.searchParams.get('closeafter') === 'state';
1185
- const pingRaw = Number(url.searchParams.get('ping') ?? '0');
1186
- const pingSeconds = Number.isFinite(pingRaw) && pingRaw > 0 ? Math.max(1, Math.floor(pingRaw)) : 0;
1616
+ const typesParam = url.searchParams.get("types") ?? "*";
1617
+ const types = typesParam === "*" || typesParam === "" ? null : new Set(typesParam
1618
+ .split(",")
1619
+ .map((entry) => entry.trim())
1620
+ .filter((entry) => entry.length > 0));
1621
+ const closeAfterState = url.searchParams.get("closeafter") === "state";
1622
+ const pingRaw = Number(url.searchParams.get("ping") ?? "0");
1623
+ const pingSeconds = Number.isFinite(pingRaw) && pingRaw > 0
1624
+ ? Math.max(1, Math.floor(pingRaw))
1625
+ : 0;
1187
1626
  const state = {
1188
1627
  accountId: account.accountId,
1189
1628
  types,
@@ -1196,7 +1635,7 @@ export class JmapServer {
1196
1635
  const stream = new ReadableStream({
1197
1636
  start: (controller) => {
1198
1637
  state.controller = controller;
1199
- controller.enqueue(textEncoder.encode(': jmap event stream\n\n'));
1638
+ controller.enqueue(textEncoder.encode(": jmap event stream\n\n"));
1200
1639
  if (pingSeconds > 0) {
1201
1640
  state.pingTimer = setInterval(() => {
1202
1641
  this.writeToStream(state, `event: ping\ndata: {"interval":${pingSeconds}}\n\n`);
@@ -1218,8 +1657,8 @@ export class JmapServer {
1218
1657
  return new Response(stream, {
1219
1658
  status: 200,
1220
1659
  headers: {
1221
- 'content-type': 'text/event-stream',
1222
- 'cache-control': 'no-cache',
1660
+ "content-type": "text/event-stream",
1661
+ "cache-control": "no-cache",
1223
1662
  },
1224
1663
  });
1225
1664
  }
@@ -1239,8 +1678,14 @@ export class JmapServer {
1239
1678
  }
1240
1679
  this.eventStreams.delete(state);
1241
1680
  if (!this.eventStreams.size && this.changeFeedUnsubscribe) {
1242
- this.changeFeedUnsubscribe();
1681
+ const unsubscribe = this.changeFeedUnsubscribe;
1243
1682
  this.changeFeedUnsubscribe = null;
1683
+ try {
1684
+ unsubscribe();
1685
+ }
1686
+ catch (error) {
1687
+ this.cleanupErrors.push(error);
1688
+ }
1244
1689
  }
1245
1690
  }
1246
1691
  closeStream(state) {
@@ -1290,7 +1735,7 @@ export class JmapServer {
1290
1735
  state.lastSent.set(type, typeState);
1291
1736
  }
1292
1737
  const stateChange = {
1293
- '@type': 'StateChange',
1738
+ "@type": "StateChange",
1294
1739
  changed: { [accountId]: filtered },
1295
1740
  };
1296
1741
  this.writeToStream(state, `event: state\ndata: ${JSON.stringify(stateChange)}\n\n`);
@@ -1322,56 +1767,120 @@ export class JmapServer {
1322
1767
  // ======================
1323
1768
  // node req/res adapter
1324
1769
  // ======================
1325
- async handleNodeRequest(req, res) {
1326
- try {
1327
- const method = (req.method ?? 'GET').toUpperCase();
1328
- let body;
1329
- if (method !== 'GET' && method !== 'HEAD') {
1330
- const chunks = [];
1331
- let total = 0;
1332
- // Cap request buffering at maxSizeUpload; larger requests never make
1333
- // it to fetchHandler (which enforces the JMAP per-endpoint limits).
1334
- const maxBuffered = JMAP_SERVER_LIMITS.maxSizeUpload + 1;
1335
- for await (const chunk of req) {
1336
- const buffer = chunk;
1337
- total += buffer.length;
1338
- if (total > maxBuffered) {
1339
- res.writeHead(413, { 'content-type': 'application/problem+json' });
1340
- res.end(JSON.stringify({
1341
- type: 'urn:ietf:params:jmap:error:limit',
1342
- limit: 'maxSizeUpload',
1343
- status: 413,
1344
- detail: 'Request body too large.',
1345
- }));
1346
- req.destroy();
1770
+ nodeRequestBody(req) {
1771
+ let closed = false;
1772
+ let cleanup = () => { };
1773
+ return new ReadableStream({
1774
+ start(controller) {
1775
+ req.pause();
1776
+ const onData = (chunk) => {
1777
+ if (closed)
1347
1778
  return;
1348
- }
1349
- chunks.push(buffer);
1350
- }
1351
- body = Buffer.concat(chunks);
1779
+ controller.enqueue(new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength));
1780
+ if ((controller.desiredSize ?? 0) <= 0)
1781
+ req.pause();
1782
+ };
1783
+ const onEnd = () => {
1784
+ if (closed)
1785
+ return;
1786
+ closed = true;
1787
+ cleanup();
1788
+ controller.close();
1789
+ };
1790
+ const onAborted = () => {
1791
+ if (closed)
1792
+ return;
1793
+ closed = true;
1794
+ cleanup();
1795
+ controller.error(new Error("Request body stream was aborted."));
1796
+ };
1797
+ const onError = (error) => {
1798
+ if (closed)
1799
+ return;
1800
+ closed = true;
1801
+ cleanup();
1802
+ controller.error(error);
1803
+ };
1804
+ cleanup = () => {
1805
+ req.off("data", onData);
1806
+ req.off("end", onEnd);
1807
+ req.off("aborted", onAborted);
1808
+ req.off("error", onError);
1809
+ };
1810
+ req.on("data", onData);
1811
+ req.once("end", onEnd);
1812
+ req.once("aborted", onAborted);
1813
+ req.once("error", onError);
1814
+ },
1815
+ pull() {
1816
+ if (!closed)
1817
+ req.resume();
1818
+ },
1819
+ cancel() {
1820
+ if (closed)
1821
+ return;
1822
+ closed = true;
1823
+ cleanup();
1824
+ // Drain without buffering so the response can reuse the connection.
1825
+ req.resume();
1826
+ },
1827
+ });
1828
+ }
1829
+ async handleNodeRequest(req, res, requestAbortController) {
1830
+ const abortRequest = (reason) => {
1831
+ if (!requestAbortController.signal.aborted) {
1832
+ requestAbortController.abort(reason);
1833
+ }
1834
+ };
1835
+ const onRequestAborted = () => {
1836
+ abortRequest(new Error("Node request was aborted by the client."));
1837
+ };
1838
+ const onRequestError = (error) => {
1839
+ abortRequest(error);
1840
+ };
1841
+ const onRequestClose = () => {
1842
+ // IncomingMessage emits close after normal completion too. Only a
1843
+ // close before the complete HTTP message is a transport abort.
1844
+ if (!req.complete)
1845
+ onRequestAborted();
1846
+ };
1847
+ const onResponseClose = () => {
1848
+ if (!res.writableEnded) {
1849
+ abortRequest(new Error("Node response connection closed before completion."));
1352
1850
  }
1851
+ };
1852
+ req.once("aborted", onRequestAborted);
1853
+ req.once("error", onRequestError);
1854
+ req.once("close", onRequestClose);
1855
+ res.once("close", onResponseClose);
1856
+ try {
1857
+ const method = (req.method ?? "GET").toUpperCase();
1353
1858
  const headers = new Headers();
1354
1859
  const skippedHeaders = new Set([
1355
- 'connection',
1356
- 'content-length',
1357
- 'expect',
1358
- 'keep-alive',
1359
- 'proxy-connection',
1360
- 'transfer-encoding',
1361
- 'upgrade',
1860
+ "connection",
1861
+ "expect",
1862
+ "keep-alive",
1863
+ "proxy-connection",
1864
+ "transfer-encoding",
1865
+ "upgrade",
1362
1866
  ]);
1363
1867
  for (const [key, value] of Object.entries(req.headers)) {
1364
1868
  if (value === undefined || skippedHeaders.has(key.toLowerCase())) {
1365
1869
  continue;
1366
1870
  }
1367
- headers.set(key, Array.isArray(value) ? value.join(', ') : value);
1871
+ headers.set(key, Array.isArray(value) ? value.join(", ") : value);
1368
1872
  }
1369
- const host = req.headers.host ?? '127.0.0.1';
1370
- const request = new Request(`http://${host}${req.url ?? '/'}`, {
1873
+ const host = req.headers.host ?? "127.0.0.1";
1874
+ const requestInit = {
1371
1875
  method,
1372
1876
  headers,
1373
- body: body ? asBodyBytes(body) : undefined,
1374
- });
1877
+ signal: requestAbortController.signal,
1878
+ };
1879
+ if (method !== "GET" && method !== "HEAD") {
1880
+ requestInit.body = this.nodeRequestBody(req);
1881
+ requestInit.duplex = "half";
1882
+ }
1883
+ const request = new Request(`http://${host}${req.url ?? "/"}`, requestInit);
1375
1884
  const response = await this.fetchHandler(request);
1376
1885
  const responseHeaders = {};
1377
1886
  response.headers.forEach((value, key) => {
@@ -1384,7 +1893,7 @@ export class JmapServer {
1384
1893
  }
1385
1894
  const reader = response.body.getReader();
1386
1895
  let clientClosed = false;
1387
- res.on('close', () => {
1896
+ res.on("close", () => {
1388
1897
  clientClosed = true;
1389
1898
  // Cancelling the reader triggers the stream's cancel handler, which
1390
1899
  // releases any per-stream resources (SSE registration, ping timer).
@@ -1409,9 +1918,15 @@ export class JmapServer {
1409
1918
  catch (error) {
1410
1919
  const message = error instanceof Error ? error.message : String(error);
1411
1920
  if (!res.headersSent) {
1412
- res.writeHead(500, { 'content-type': 'application/problem+json' });
1921
+ res.writeHead(500, { "content-type": "application/problem+json" });
1413
1922
  }
1414
- res.end(JSON.stringify({ type: 'about:blank', status: 500, detail: message }));
1923
+ res.end(JSON.stringify({ type: "about:blank", status: 500, detail: message }));
1924
+ }
1925
+ finally {
1926
+ req.off("aborted", onRequestAborted);
1927
+ req.off("error", onRequestError);
1928
+ req.off("close", onRequestClose);
1929
+ res.off("close", onResponseClose);
1415
1930
  }
1416
1931
  }
1417
1932
  // ======================
@@ -1422,19 +1937,21 @@ export class JmapServer {
1422
1937
  return null;
1423
1938
  }
1424
1939
  if (!Array.isArray(requested)) {
1425
- throw new JmapServerMethodError('invalidArguments', 'properties must be an array or null.');
1940
+ throw new JmapServerMethodError("invalidArguments", "properties must be an array or null.");
1426
1941
  }
1427
1942
  for (const property of requested) {
1428
- if (typeof property !== 'string' || !known.has(property)) {
1429
- throw new JmapServerMethodError('invalidArguments', `Unknown property "${String(property)}".`);
1943
+ if (typeof property !== "string" || !known.has(property)) {
1944
+ throw new JmapServerMethodError("invalidArguments", `Unknown property "${String(property)}".`);
1430
1945
  }
1431
1946
  }
1432
- return requested.includes('id') ? requested : ['id', ...requested];
1947
+ return requested.includes("id") ? requested : ["id", ...requested];
1433
1948
  }
1434
1949
  projectObject(source, properties) {
1435
1950
  const projected = {};
1436
1951
  for (const property of properties) {
1437
- projected[property] = source[property] === undefined ? null : source[property];
1952
+ projected[property] = source[property] === undefined
1953
+ ? null
1954
+ : source[property];
1438
1955
  }
1439
1956
  return projected;
1440
1957
  }
@@ -1443,18 +1960,18 @@ export class JmapServer {
1443
1960
  return 0;
1444
1961
  }
1445
1962
  if (!Number.isInteger(args.position) || args.position < 0) {
1446
- throw new JmapServerMethodError('invalidArguments', 'position must be a non-negative integer.');
1963
+ throw new JmapServerMethodError("invalidArguments", "position must be a non-negative integer.");
1447
1964
  }
1448
1965
  return args.position;
1449
1966
  }
1450
1967
  validateChangesArgs(args) {
1451
- if (typeof args.sinceState !== 'string') {
1452
- throw new JmapServerMethodError('invalidArguments', 'sinceState is required.');
1968
+ if (typeof args.sinceState !== "string") {
1969
+ throw new JmapServerMethodError("invalidArguments", "sinceState is required.");
1453
1970
  }
1454
1971
  let maxChanges;
1455
1972
  if (args.maxChanges !== undefined && args.maxChanges !== null) {
1456
1973
  if (!Number.isInteger(args.maxChanges) || args.maxChanges <= 0) {
1457
- throw new JmapServerMethodError('invalidArguments', 'maxChanges must be a positive integer.');
1974
+ throw new JmapServerMethodError("invalidArguments", "maxChanges must be a positive integer.");
1458
1975
  }
1459
1976
  maxChanges = args.maxChanges;
1460
1977
  }
@@ -1463,17 +1980,22 @@ export class JmapServer {
1463
1980
  jsonResponse(status, body) {
1464
1981
  return new Response(JSON.stringify(body), {
1465
1982
  status,
1466
- headers: { 'content-type': 'application/json' },
1983
+ headers: { "content-type": "application/json" },
1467
1984
  });
1468
1985
  }
1469
1986
  problemResponse(status, type, detail, extraHeaders = {}) {
1470
1987
  return new Response(JSON.stringify({ type, status, detail }), {
1471
1988
  status,
1472
- headers: { 'content-type': 'application/problem+json', ...extraHeaders },
1989
+ headers: { "content-type": "application/problem+json", ...extraHeaders },
1473
1990
  });
1474
1991
  }
1475
1992
  limitResponse(status, limit, detail) {
1476
- return new Response(JSON.stringify({ type: 'urn:ietf:params:jmap:error:limit', limit, status, detail }), { status, headers: { 'content-type': 'application/problem+json' } });
1993
+ return new Response(JSON.stringify({
1994
+ type: "urn:ietf:params:jmap:error:limit",
1995
+ limit,
1996
+ status,
1997
+ detail,
1998
+ }), { status, headers: { "content-type": "application/problem+json" } });
1477
1999
  }
1478
2000
  }
1479
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5qbWFwc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5qbWFwc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsMEJBQTBCLEdBRzNCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQVdOLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFvQm5FLDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRztJQUNoQyxhQUFhLEVBQUUsVUFBVTtJQUN6QixtQkFBbUIsRUFBRSxDQUFDO0lBQ3RCLGNBQWMsRUFBRSxVQUFVO0lBQzFCLHFCQUFxQixFQUFFLENBQUM7SUFDeEIsaUJBQWlCLEVBQUUsRUFBRTtJQUNyQixlQUFlLEVBQUUsR0FBRztJQUNwQixlQUFlLEVBQUUsR0FBRztDQUNyQixDQUFDO0FBRUYsNkVBQTZFO0FBQzdFLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUUxQixzREFBc0Q7QUFDdEQsTUFBTSx3QkFBd0IsR0FBRztJQUMvQixJQUFJO0lBQ0osUUFBUTtJQUNSLFVBQVU7SUFDVixZQUFZO0lBQ1osVUFBVTtJQUNWLE1BQU07SUFDTixZQUFZO0lBQ1osV0FBVztJQUNYLFdBQVc7SUFDWCxZQUFZO0lBQ1osUUFBUTtJQUNSLE1BQU07SUFDTixJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixlQUFlO0lBQ2YsU0FBUztJQUNULFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtJQUNWLGFBQWE7Q0FDZCxDQUFDO0FBQ0YsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyx3QkFBd0IsQ0FB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
2001
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5qbWFwc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5qbWFwc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUVMLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIsMEJBQTBCLEdBRTNCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQVlOLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFbkU7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLENBQVUsQ0FBQztBQXFENUQsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFzQjtJQUNuRCxhQUFhLEVBQUUsVUFBVTtJQUN6QixtQkFBbUIsRUFBRSxDQUFDO0lBQ3RCLGNBQWMsRUFBRSxVQUFVO0lBQzFCLHFCQUFxQixFQUFFLENBQUM7SUFDeEIsaUJBQWlCLEVBQUUsRUFBRTtJQUNyQixlQUFlLEVBQUUsR0FBRztJQUNwQixlQUFlLEVBQUUsR0FBRztDQUNyQixDQUFDO0FBRUYsNkVBQTZFO0FBQzdFLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUUxQixzREFBc0Q7QUFDdEQsTUFBTSx3QkFBd0IsR0FBRztJQUMvQixJQUFJO0lBQ0osUUFBUTtJQUNSLFVBQVU7SUFDVixZQUFZO0lBQ1osVUFBVTtJQUNWLE1BQU07SUFDTixZQUFZO0lBQ1osV0FBVztJQUNYLFdBQVc7SUFDWCxZQUFZO0lBQ1osUUFBUTtJQUNSLE1BQU07SUFDTixJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxTQUFTO0lBQ1QsU0FBUztJQUNULFFBQVE7SUFDUixlQUFlO0lBQ2YsU0FBUztJQUNULFlBQVk7SUFDWixVQUFVO0lBQ1YsVUFBVTtJQUNWLGFBQWE7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