<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.32 (Ruby 3.3.0) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-gondwana-jmap-blobext-01" category="std" consensus="true" submissionType="IETF" updates="8620, 9404" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="JMAP Blob Extended">JMAP Blob Extensions</title>

    <author initials="B." surname="Gondwana" fullname="Bron Gondwana">
      <organization>Fastmail</organization>
      <address>
        <email>brong@fastmailteam.com</email>
      </address>
    </author>

    <date year="2026" month="March" day="14"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 30?>

<t>The JMAP base protocol (RFC8620) provides the ability to upload and download
arbitrary binary data.  This binary data is called a "blob", and can be used
in all other JMAP extensions.</t>

<t>The JMAP blob extension (RFC9404) added additional ways to create and access
blobs by making inline method calls within a standard JMAP request.</t>

<t>This extension adds more methods to work with blobs, including handling large
blobs by processing them in chunks (building on RFC9404's blob construction
support), and providing server-side blob conversion operations: image format
conversion, archive creation and extraction (zip, tar, cpio), compression
and decompression, and binary delta (rdiff) operations.</t>



    </abstract>



  </front>

  <middle>


<?line 45?>

<section anchor="introduction"><name>Introduction</name>

<t>The JMAP Blob extension (<xref target="JMAP-BLOB"/> — JMAP Blob Management) offers additional
ways to create blobs, and query where they are used.</t>

<t>This extension builds on that work, offering ways to find more information about
the internal structure of the server's blob store in order to work efficiently
with it, and a new Blob/convert method for server-side blob transformations
including image format conversion, archive creation and extraction, compression
and decompression, and binary delta (rdiff) operations.</t>

<section anchor="conventions-used-in-this-document"><name>Conventions Used in This Document</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
</section>
<section anchor="addition-to-the-capabilities-object"><name>Addition to the Capabilities Object</name>

<t>The capabilities object is returned as part of the JMAP Session
object; see <xref target="JMAP-CORE"/>, Section 2.</t>

<t>This document defines an additional capability URI.</t>

<section anchor="urnietfparamsjmapblobext"><name>urn:ietf:params:jmap:blobext</name>

<t>The capability <spanx style="verb">urn:ietf:params:jmap:blobext</spanx> being present in the
"accountCapabilities" property of an account represents support for
these extended properties on that account.  This capability depends
on <spanx style="verb">urn:ietf:params:jmap:blob</spanx> (<xref target="JMAP-BLOB"/>); both <bcp14>MUST</bcp14> be present
in the account's "accountCapabilities" and in the request's <spanx style="verb">using</spanx>
array.  If this capability is present in one or more
"accountCapabilities" properties then the server <bcp14>MUST</bcp14> also include
the key in the "capabilities" property.</t>

<t>The value of this property in the JMAP session "capabilities"
property <bcp14>MUST</bcp14> be an empty object.</t>

<t>The value of this property in an account's "accountCapabilities"
property is an object that <bcp14>MUST</bcp14> contain the following information
on server capabilities and permissions for that account:</t>

<t><list style="symbols">
  <t>resumableUploadUrl: "String|null"  <vspace blankLines='1'/>
If present, a <xref target="URI-TEMPLATE"/> which supports <xref target="HTTP-RESUMABLE-UPLOADS"/>.
  This <bcp14>MAY</bcp14> be the same as the uploadUrl, and has the same keys.</t>
  <t>chunkSize: "UnsignedInt|null"  <vspace blankLines='1'/>
The size in octets which the server uses to split large files
  into chunks.  If a client uploads blobs with exactly this size
  except for the final chunk, and uses Blob/upload with
  DataSourceObjects referencing these chunks, it is expected that
  the server can optimise these chunks.  Servers <bcp14>MUST</bcp14> allow other sizes
  for the individual data blocks in Blob/upload though, and will
  then choose whether to store them as an array of blobs still,
  or to combine them.</t>
  <t>supportedImageTypes: "String[]"  <vspace blankLines='1'/>
The media types (<xref target="MEDIA-TYPES"/>) supported for ImageConvertRecipe.</t>
  <t>supportedArchiveTypes: "String[]"  <vspace blankLines='1'/>
The archive MIME types supported for ArchiveRecipe and UnArchiveRecipe.
  Defined values are "application/zip", "application/x-tar", and
  "application/x-cpio".</t>
  <t>supportedCompressionTypes: "String[]"  <vspace blankLines='1'/>
The compression MIME types supported for CompressRecipe and
  UnCompressRecipe.  Defined values are "application/gzip",
  "application/x-bzip2", "application/x-xz", and "application/zstd".</t>
  <t>supportsRdiff: "Boolean"  <vspace blankLines='1'/>
Whether the server supports RdiffRecipe operations.  If false,
  the server will reject RdiffRecipe requests with an
  "invalidProperties" SetError.</t>
  <t>maxConvertSize: "UnsignedInt|null"  <vspace blankLines='1'/>
If supplied, the maximum size in octets of any single input
  blob to a Blob/convert operation.  Requests referencing a blob
  larger than this value <bcp14>MUST</bcp14> be rejected with a "tooLarge"
  SetError.  If null, the server does not advertise a specific
  limit but <bcp14>MAY</bcp14> still reject blobs that are too large.</t>
  <t>maxArchiveEntries: "UnsignedInt|null"  <vspace blankLines='1'/>
If supplied, the maximum number of entries allowed in an
  ArchiveRecipe.  Requests exceeding this limit <bcp14>MUST</bcp14> be rejected
  with a "tooLarge" SetError.  If null, the server does not
  advertise a specific limit but <bcp14>MAY</bcp14> still reject requests with
  too many entries.</t>
  <t>maxImageDimension: "UnsignedInt|null"  <vspace blankLines='1'/>
If supplied, the maximum value accepted for <spanx style="verb">width</spanx> or <spanx style="verb">height</spanx>
  in an ImageConvertRecipe, in pixels.  Requests exceeding this
  limit <bcp14>MUST</bcp14> be rejected with a "tooLarge" SetError.  If null,
  the server does not advertise a specific limit but <bcp14>MAY</bcp14> still
  reject requests with dimensions that are too large.</t>
</list></t>

<section anchor="capability-example"><name>Capability Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "urn:ietf:params:jmap:blobext": {
    "resumableUploadUrl": null,
    "chunkSize": 5242880,
    "supportedImageTypes": [
      "image/png",
      "image/jpeg",
      "image/gif"
    ],
    "supportedArchiveTypes": [
      "application/zip",
      "application/x-tar"
    ],
    "supportedCompressionTypes": [
      "application/gzip",
      "application/x-bzip2",
      "application/zstd"
    ],
    "supportsRdiff": true,
    "maxConvertSize": 104857600,
    "maxArchiveEntries": 10000,
    "maxImageDimension": 8192
  }
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="additions-to-blobget"><name>Additions to Blob/get</name>

<t>When this capability is present, Blob/get accepts an additional
request argument:</t>

<t><list style="symbols">
  <t>dataSourceProperties: "String[]" (default: ["blobId", "size"])
If supplied, only the properties listed in the array are returned
for each DataSourceObject in the <spanx style="verb">chunks</spanx> array.  If omitted, the
default of <spanx style="verb">["blobId", "size"]</spanx> is used.  Available properties
include <spanx style="verb">blobId</spanx>, <spanx style="verb">size</spanx>, <spanx style="verb">offset</spanx>, <spanx style="verb">length</spanx>, <spanx style="verb">position</spanx>, and
<spanx style="verb">digest:*</spanx> values (e.g. <spanx style="verb">digest:sha-256</spanx>).</t>
</list></t>

<t>Blob/get also returns an additional response property (returned by
default when this capability is included in <spanx style="verb">using</spanx>):</t>

<t><list style="symbols">
  <t>chunks: "DataSourceObject[]"  <vspace blankLines='1'/>
An array of one or more data source objects (as defined in <xref target="JMAP-BLOB"/>,
  Section 4.2).  The blob is reconstructed by concatenating the data
  from each data source object in the listed order.  While it is
  expected that each data source object will reference the entire
  underlying chunk blob, the server <bcp14>MAY</bcp14> return offset and length values
  that select only a portion of a chunk's blob.  The client <bcp14>MUST</bcp14> use
  the offset and length to determine which octets to read from each
  chunk.</t>
</list></t>

</section>
<section anchor="additions-to-datasourceobject"><name>Additions to DataSourceObject</name>

<t>When this capability is present, the DataSourceObject (as defined in
<xref target="JMAP-BLOB"/>, Section 4.2) is extended with the following additional
properties.  These apply both to the <spanx style="verb">chunks</spanx> returned by Blob/get
and to DataSourceObjects used in Blob/upload.  The <spanx style="verb">offset</spanx> and
<spanx style="verb">length</spanx> properties are already defined in <xref target="JMAP-BLOB"/>; they are
listed here to document their use in the <spanx style="verb">chunks</spanx> response context,
where they describe the range of each chunk's underlying data source
that contributes to the containing blob.</t>

<t><list style="symbols">
  <t>offset: "UnsignedInt|null"
The offset within the data source from which to start copying
octets (see <xref target="JMAP-BLOB"/>).  <bcp14>MUST</bcp14> fit within the data source
(i.e. offset <bcp14>MUST</bcp14> be less than or equal to the data source size).
If null, defaults to 0 (the start of the data source).</t>
  <t>length: "UnsignedInt|null"
The number of octets to copy from the data source (see
<xref target="JMAP-BLOB"/>).  <bcp14>MUST</bcp14> fit within the data source (i.e. offset +
length <bcp14>MUST</bcp14> be less than or equal to the data source size).  If
null, copy from <spanx style="verb">offset</spanx> to the end of the data source.</t>
  <t>size: "UnsignedInt|null"
The full size of the chunk's underlying data source in octets.</t>
  <t>position: "UnsignedInt|null"
The byte offset of the start of this chunk within the outer
(containing) blob.</t>
</list></t>

<t>If a <spanx style="verb">digest:*</spanx> property (e.g. <spanx style="verb">digest:sha</spanx>, <spanx style="verb">digest:sha-256</spanx>) is
included in <spanx style="verb">dataSourceProperties</spanx>, each DataSourceObject in the
<spanx style="verb">chunks</spanx> array will include the corresponding digest value computed
over the octets that this chunk contributes (i.e. after applying
<spanx style="verb">offset</spanx> and <spanx style="verb">length</spanx>).</t>

<t>When a server provides <spanx style="verb">size</spanx>, <spanx style="verb">position</spanx>, or <spanx style="verb">digest:*</spanx> values in
a Blob/get response, it <bcp14>MUST</bcp14> calculate them correctly.  When a
DataSourceObject containing <spanx style="verb">size</spanx>, <spanx style="verb">position</spanx>, or <spanx style="verb">digest:*</spanx> values
is used in Blob/upload, the server <bcp14>MUST</bcp14> reject the object if any
provided value does not match the actual data.</t>

</section>
<section anchor="additions-to-blobupload"><name>Additions to Blob/upload</name>

<t>When this capability is present, Blob/upload (<xref target="JMAP-BLOB"/>, Section 4)
gains the following additional request property:</t>

<t><list style="symbols">
  <t>noPersist: "Boolean" (default: false)
If true, blobs created by this call are ephemeral: they may be
referenced via creation id backreferences within the same JMAP
request, but the server is not required to persist them beyond the
lifetime of the request.  The server <bcp14>MAY</bcp14> omit ephemeral blobs from
the <spanx style="verb">created</spanx> map of the response and from the <spanx style="verb">createdIds</spanx> of the
final Response object if it did not create a referenceable blob.
This allows servers to optimise pipelines where intermediate blobs
are never needed after the request completes.</t>
</list></t>

</section>
<section anchor="new-method-blobconvert"><name>New method Blob/convert</name>

<t>Blob/convert is defined under the <spanx style="verb">urn:ietf:params:jmap:blobext</spanx>
capability and requires that capability in the request's <spanx style="verb">using</spanx>
array.</t>

<t>Blob/convert performs server-side transformations on blobs.  Like
Blob/upload (<xref target="JMAP-BLOB"/>, Section 4), it takes an <spanx style="verb">accountId</spanx> and a
<spanx style="verb">create</spanx> argument that maps creation ids to conversion request objects.</t>

<t>Each conversion request object <bcp14>MAY</bcp14> also include the following property:</t>

<t><list style="symbols">
  <t>noPersist: "Boolean" (default: false)
If true, the resulting blob is ephemeral: it may be referenced via
creation id backreferences within the same JMAP request, but the
server is not required to persist it beyond the lifetime of the
request.  The server <bcp14>MAY</bcp14> omit ephemeral blobs from the <spanx style="verb">created</spanx>
map of the response and from the <spanx style="verb">createdIds</spanx> of the final Response
object if it did not create a referenceable blob.</t>
</list></t>

<t>Each conversion request object <bcp14>MUST</bcp14> contain exactly one of the
following properties, which determines the type of conversion:</t>

<t><list style="symbols">
  <t>imageConvert: ImageConvertRecipe</t>
  <t>archive: ArchiveRecipe</t>
  <t>unArchive: UnArchiveRecipe</t>
  <t>compress: CompressRecipe</t>
  <t>unCompress: UnCompressRecipe</t>
  <t>rdiff: RdiffRecipe</t>
</list></t>

<t>The response has the same structure as Blob/upload (<xref target="JMAP-BLOB"/>,
Section 4): a <spanx style="verb">created</spanx> map of creation id to an object containing
<spanx style="verb">id</spanx>, <spanx style="verb">type</spanx>, and <spanx style="verb">size</spanx> for each successful conversion, and a
<spanx style="verb">notCreated</spanx> map of creation id to a SetError object for each failed
conversion.  The <spanx style="verb">id</spanx> is the blobId of the created blob.  The server
<bcp14>MAY</bcp14> also return an <spanx style="verb">expires</spanx> property as described in <xref target="JMAP-CORE"/>,
Section 6.1.  Creation id backreferences (using the <spanx style="verb">#</spanx> prefix)
resolve to this <spanx style="verb">id</spanx> and may be used in subsequent conversions within
the same Blob/convert call or in later method calls within the same
JMAP request.</t>

<t>The server <bcp14>MUST</bcp14> resolve the order of dependencies between entries
in the <spanx style="verb">create</spanx> map and process them in an order such that all
backreferences are satisfied.  If a dependency cycle is detected,
all members of the cycle <bcp14>MUST</bcp14> be rejected with an
"invalidProperties" error.</t>

<section anchor="imageconvertrecipe"><name>ImageConvertRecipe</name>

<t>An ImageConvertRecipe converts an image blob to a different format
or size.  It is an object with the following properties:</t>

<t><list style="symbols">
  <t>blobId: "BlobId"
The blobId of the source image.</t>
  <t>type: "String"
Media type (<xref target="MEDIA-TYPES"/>) of the image to create (e.g.
"image/png").  <bcp14>MUST</bcp14> be one of the values in the server's
<spanx style="verb">supportedImageTypes</spanx> capability.</t>
  <t>width: "UnsignedInt|null"
Maximum width in pixels of the image to create.  If null, the
server preserves the source width (or scales proportionally if
only <spanx style="verb">height</spanx> is given).</t>
  <t>height: "UnsignedInt|null"
Maximum height in pixels of the image to create.  If null, the
server preserves the source height (or scales proportionally if
only <spanx style="verb">width</spanx> is given).</t>
  <t>ignoreAspect: "Boolean|null"
If true, resize to exactly the given width and height, even if
the aspect ratio is changed.  If null or false, the image is
scaled to fit within the given dimensions while preserving the
aspect ratio.</t>
  <t>quality: "UnsignedInt|null"
Compression quality for lossy formats, as a value from 1 (lowest
quality, smallest file) to 100 (highest quality, largest file).
Only meaningful for formats that support lossy compression such as
image/jpeg and image/webp.  If null, the server selects a sensible
default.</t>
  <t>colorSpace: "String|null"
The color space for the output image.  Defined values are "sRGB"
and "grayscale".  If null, the server preserves the source image's
color space where possible.</t>
  <t>background: "String|null"
A fill color to use when the source image has transparency but the
target format does not support it (e.g. converting PNG to JPEG).
The value is a CSS-style hex color string (e.g. "#ffffff" for white).
If null, the server selects a sensible default (typically white).</t>
  <t>stripMetadata: "Boolean|null"
If true, strip image metadata such as EXIF, XMP, and IPTC data from
the output.  If null or false, the server preserves metadata where
the target format supports it.</t>
  <t>autoOrient: "Boolean|null"
If true, automatically rotate and flip the image according to its
EXIF orientation tag, then reset the tag.  If null or false, the
image data is not reoriented.</t>
</list></t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — the referenced blobId does not exist.</t>
  <t>"invalidProperties" — the type is not in <spanx style="verb">supportedImageTypes</spanx>, or
the source blob is not a supported image format.</t>
  <t>"tooLarge" — the source blob exceeds <spanx style="verb">maxConvertSize</spanx>, or the
requested dimensions exceed <spanx style="verb">maxImageDimension</spanx>.</t>
</list></t>

</section>
<section anchor="archiverecipe"><name>ArchiveRecipe</name>

<t>An ArchiveRecipe creates an archive blob from a list of entries.
It is an object with the following properties:</t>

<t><list style="symbols">
  <t>type: "String"
The MIME type of the archive to create.  <bcp14>MUST</bcp14> be one of the values
in the server's <spanx style="verb">supportedArchiveTypes</spanx> capability.  Defined values
are "application/zip", "application/x-tar", and "application/x-cpio".</t>
  <t>entries: "ArchiveEntry[]"
An array of ArchiveEntry objects describing the contents of the
archive.</t>
</list></t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — a referenced entry blobId does not exist.</t>
  <t>"invalidProperties" — the type is not in <spanx style="verb">supportedArchiveTypes</spanx>;
an entry has an unsupported entryType for the archive format; or
a required field (e.g. linkTarget for symlink entries) is missing.</t>
  <t>"tooLarge" — the number of entries exceeds <spanx style="verb">maxArchiveEntries</spanx>,
or a referenced blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
</list></t>

<section anchor="archiveentry"><name>ArchiveEntry</name>

<t>An ArchiveEntry describes a single entry in an archive.  It is used
both as input (in ArchiveRecipe) and as output (in UnArchiveRecipe
results).  It is an object with the following properties:</t>

<t><list style="symbols">
  <t>name: "String"
The path of the entry within the archive.  Directory entries <bcp14>MUST</bcp14>
have a name ending with "/".</t>
  <t>blobId: "BlobId|null"
The blobId of the content for this entry.  <bcp14>MUST</bcp14> be non-null for
file entries.  <bcp14>MUST</bcp14> be null or absent for directory, symlink,
hardlink, fifo, and device entries.  Violating these constraints
is an "invalidProperties" error.</t>
  <t>entryType: "String|null"
The type of the entry.  If null, defaults to "file".  Defined values
are "file" (a regular file, the default), "directory", "symlink"
(a symbolic link), "hardlink" (a hard link), "fifo" (a named pipe),
"blockDevice" (a block device node), and "charDevice" (a character
device node).  The server <bcp14>MUST</bcp14> reject entries with unsupported
types for the chosen archive format with an "invalidProperties"
error.</t>
  <t>modified: "UTCDate|null"
The modification time of the entry as an RFC 3339 timestamp.
If null, defaults to the current server time.</t>
  <t>linkTarget: "String|null"
The target path for symlink and hardlink entries.  <bcp14>MUST</bcp14> be non-null
when entryType is "symlink" or "hardlink".  <bcp14>MUST</bcp14> be null for all
other entry types.</t>
  <t>mode: "String|null"
Unix file permissions as an octal string (e.g. "0755", "0644").
If null, the server chooses a reasonable default.  This is
represented as a string rather than an integer to avoid ambiguity
between octal and decimal interpretation.</t>
  <t>uid: "UnsignedInt|null"
The numeric user ID of the entry owner.</t>
  <t>gid: "UnsignedInt|null"
The numeric group ID of the entry owner.</t>
  <t>ownerName: "String|null"
The user name of the entry owner.</t>
  <t>groupName: "String|null"
The group name of the entry owner.</t>
  <t>devMajor: "UnsignedInt|null"
The major device number for "blockDevice" and "charDevice" entries.</t>
  <t>devMinor: "UnsignedInt|null"
The minor device number for "blockDevice" and "charDevice" entries.</t>
  <t>comment: "String|null"
A comment string for this entry.</t>
  <t>compressionMethod: "String|null"
The per-entry compression method.  Defined values are "store" (no
compression) and "deflate".  If null, the server chooses a
reasonable default.</t>
</list></t>

</section>
<section anchor="considerations-for-applicationzip"><name>Considerations for application/zip</name>

<t>The zip format only supports "file" and "directory" entry types.
The <spanx style="verb">comment</spanx> and <spanx style="verb">compressionMethod</spanx> properties are only meaningful
for zip archives.  The <spanx style="verb">mode</spanx>, <spanx style="verb">uid</spanx>, <spanx style="verb">gid</spanx>, <spanx style="verb">ownerName</spanx>,
<spanx style="verb">groupName</spanx>, <spanx style="verb">devMajor</spanx>, and <spanx style="verb">devMinor</spanx> properties are ignored.</t>

</section>
<section anchor="considerations-for-applicationx-tar"><name>Considerations for application/x-tar</name>

<t>The tar format supports all entry types.  The <spanx style="verb">mode</spanx>, <spanx style="verb">uid</spanx>, <spanx style="verb">gid</spanx>,
<spanx style="verb">ownerName</spanx>, <spanx style="verb">groupName</spanx>, <spanx style="verb">devMajor</spanx>, and <spanx style="verb">devMinor</spanx> properties are
meaningful for tar archives.  The <spanx style="verb">comment</spanx> and <spanx style="verb">compressionMethod</spanx>
properties are ignored.</t>

<t>Tar archives are not inherently compressed.  To create a compressed
tar archive (e.g. a .tar.gz file), first create the tar archive
using ArchiveRecipe, then compress the result using CompressRecipe.
The following example creates a .tar.gz containing three files in a
single Blob/convert call, using a backreference from the archive
creation to the compression step:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "create": {
    "t1": {
      "archive": {
        "type": "application/x-tar",
        "entries": [
          {
            "name": "site/index.html",
            "blobId": "Baaaa",
            "modified": "2026-03-01T12:00:00Z",
            "mode": "0644"
          },
          {
            "name": "site/logo.png",
            "blobId": "Bbbbb",
            "modified": "2026-02-15T09:30:00Z",
            "mode": "0644"
          },
          {
            "name": "site/style.css",
            "blobId": "Bcccc",
            "modified": "2026-03-01T12:00:00Z",
            "mode": "0644"
          }
        ]
      }
    },
    "t2": {
      "compress": {
        "blobId": "#t1",
        "type": "application/gzip"
      }
    }
  }
}, "0"]]
]]></sourcecode></figure>

</section>
<section anchor="considerations-for-applicationx-cpio"><name>Considerations for application/x-cpio</name>

<t>The cpio format supports all entry types except that <spanx style="verb">ownerName</spanx> and
<spanx style="verb">groupName</spanx> are not supported.  The <spanx style="verb">comment</spanx> and
<spanx style="verb">compressionMethod</spanx> properties are ignored.</t>

</section>
</section>
<section anchor="unarchiverecipe"><name>UnArchiveRecipe</name>

<t>An UnArchiveRecipe extracts the entry listing from an existing archive
blob.  It is an object with the following properties:</t>

<t><list style="symbols">
  <t>blobId: "BlobId"
The blobId of the archive to extract.</t>
  <t>type: "String|null"
The MIME type of the archive format.  If null, the server <bcp14>SHOULD</bcp14>
attempt to auto-detect the format from the blob content (e.g. by
inspecting magic bytes).  If auto-detection fails, the server <bcp14>MUST</bcp14>
return an "unknownFormat" error.</t>
</list></t>

<t>In addition to the standard creation response properties, a
successful UnArchiveRecipe result includes:</t>

<t><list style="symbols">
  <t>entries: "ArchiveEntry[]"
An array of ArchiveEntry objects describing the contents of the
archive.  Each file entry will have a blobId that can be used to
access the content of that entry.</t>
</list></t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — the referenced blobId does not exist.</t>
  <t>"unknownFormat" — the server could not determine or does not support
the archive format.</t>
  <t>"invalidProperties" — the type is not in <spanx style="verb">supportedArchiveTypes</spanx>.</t>
  <t>"tooLarge" — the source blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
</list></t>

</section>
<section anchor="compressrecipe"><name>CompressRecipe</name>

<t>A CompressRecipe compresses a blob using a specified compression
algorithm.  It is an object with the following properties:</t>

<t><list style="symbols">
  <t>blobId: "BlobId"
The blobId of the data to compress.</t>
  <t>type: "String"
The MIME type of the compression format to use.  <bcp14>MUST</bcp14> be one of the
values in the server's <spanx style="verb">supportedCompressionTypes</spanx> capability.
Defined values are "application/gzip", "application/x-bzip2",
"application/x-xz", and "application/zstd".</t>
  <t>level: "UnsignedInt|null"
The compression level, where higher values produce smaller output
at the cost of more CPU time.  If null, the server uses the
format's default level.  The valid range depends on the format;
if the requested level is outside the valid range, the server
<bcp14>SHOULD</bcp14> use the nearest valid value.</t>
  <t>checksum: "Boolean|null"
If true, include an integrity checksum in the compressed output.
If null, the server uses the format's default behaviour.</t>
</list></t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — the referenced blobId does not exist.</t>
  <t>"invalidProperties" — the type is not in <spanx style="verb">supportedCompressionTypes</spanx>.</t>
  <t>"tooLarge" — the source blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
</list></t>

<section anchor="considerations-for-applicationgzip"><name>Considerations for application/gzip</name>

<t>Compression level ranges from 1 (fastest) to 9 (best compression).
The default is typically 6.  Gzip always includes a CRC-32 checksum;
the <spanx style="verb">checksum</spanx> property is ignored.</t>

</section>
<section anchor="considerations-for-applicationx-bzip2"><name>Considerations for application/x-bzip2</name>

<t>Compression level ranges from 1 (fastest, 100k block size) to 9
(best compression, 900k block size).  The default is typically 9.
Bzip2 always includes a CRC-32 checksum; the <spanx style="verb">checksum</spanx> property is
ignored.</t>

</section>
<section anchor="considerations-for-applicationx-xz"><name>Considerations for application/x-xz</name>

<t>Compression level ranges from 0 (fastest) to 9 (best compression).
The default is typically 6.  Xz always includes an integrity check;
if <spanx style="verb">checksum</spanx> is true the server <bcp14>SHOULD</bcp14> use SHA-256, otherwise CRC-64
is used by default.</t>

</section>
<section anchor="considerations-for-applicationzstd"><name>Considerations for application/zstd</name>

<t>Compression level ranges from 1 (fastest) to 22 (best compression).
The default is typically 3.  If <spanx style="verb">checksum</spanx> is true, an xxHash-64
checksum is included in the frame; the default is false.</t>

</section>
</section>
<section anchor="uncompressrecipe"><name>UnCompressRecipe</name>

<t>An UnCompressRecipe decompresses a compressed blob.  It is an object
with the following properties:</t>

<t><list style="symbols">
  <t>blobId: "BlobId"
The blobId of the compressed data to decompress.</t>
  <t>type: "String|null"
The MIME type of the compression format.  If null, the server <bcp14>SHOULD</bcp14>
attempt to auto-detect the format from magic bytes.  If auto-detection
fails, the server <bcp14>MUST</bcp14> return an "unknownFormat" error.</t>
</list></t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — the referenced blobId does not exist.</t>
  <t>"unknownFormat" — the server could not determine or does not support
the compression format.</t>
  <t>"invalidProperties" — the type is not in <spanx style="verb">supportedCompressionTypes</spanx>.</t>
  <t>"tooLarge" — the source blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
</list></t>

</section>
<section anchor="rdiffrecipe"><name>RdiffRecipe</name>

<t>An RdiffRecipe performs rdiff operations for efficient binary delta
transfer.  It supports three actions: computing a signature, generating
a delta, and applying a patch.  It is an object with the following
properties:</t>

<t><list style="symbols">
  <t>action: "String"
The rdiff operation to perform.  <bcp14>MUST</bcp14> be one of "signature" (compute
a signature of the source blob), "delta" (compute a delta between a
signature and a new file), or "patch" (apply a delta to a source blob).</t>
  <t>sourceBlobId: "BlobId"
The source blob.  For "signature", this is the file to compute
the signature of.  For "delta", this is the signature blob.  For
"patch", this is the basis file to apply the delta to.</t>
  <t>deltaBlobId: "BlobId|null"
The delta blob to apply.  <bcp14>MUST</bcp14> be non-null when action is "patch".
<bcp14>MUST</bcp14> be null otherwise.</t>
  <t>newFileBlobId: "BlobId|null"
The new file to compute a delta against.  <bcp14>MUST</bcp14> be non-null when
action is "delta".  <bcp14>MUST</bcp14> be null otherwise.</t>
  <t>blockSize: "UnsignedInt|null"
The signature block size in bytes.  Only meaningful when action is
"signature".  Smaller blocks produce more precise deltas but larger
signature files.  If null, the server selects a default based on
the source file size.</t>
  <t>strongHashAlgorithm: "String|null"
The hash algorithm used for strong checksums in the signature.
Only meaningful when action is "signature".  Defined values are
"blake2" and "md4".  If null, the server selects a sensible default
(typically "blake2").  Note that "md4" is provided only for
compatibility with older rdiff implementations; new signatures
<bcp14>SHOULD</bcp14> use "blake2".</t>
</list></t>

<t>For "signature", the result blob is the signature.  For "delta",
it is the delta.  For "patch", it is the patched file.</t>

<t>Errors:</t>

<t><list style="symbols">
  <t>"notFound" — a referenced blobId does not exist.</t>
  <t>"invalidProperties" — the action is not one of the defined values;
a required blobId (deltaBlobId or newFileBlobId) is missing for the
given action; or a blobId was provided for a field that should be
null for the given action.</t>
  <t>"tooLarge" — a referenced blob exceeds <spanx style="verb">maxConvertSize</spanx>.</t>
</list></t>

</section>
</section>
</section>
<section anchor="examples"><name>Examples</name>

<section anchor="querying-blob-chunks"><name>Querying Blob Chunks</name>

<t>This example fetches a blob's chunk structure with offsets, sizes,
and SHA-256 digests:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/get", {
  "accountId": "abc",
  "ids": ["B1a2b3c"],
  "dataSourceProperties": [
    "blobId", "size", "offset", "length", "position",
    "digest:sha-256"
  ]
}, "0"]]
]]></sourcecode></figure>

<t>The response shows the blob is stored as two chunks:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/get", {
  "accountId": "abc",
  "list": [{
    "id": "B1a2b3c",
    "size": 10485760,
    "chunks": [
      {
        "blobId": "Bchunk1",
        "size": 5242880,
        "offset": 0,
        "length": 5242880,
        "position": 0,
        "digest:sha-256": "a1b2c3..."
      },
      {
        "blobId": "Bchunk2",
        "size": 5242880,
        "offset": 0,
        "length": 5242880,
        "position": 5242880,
        "digest:sha-256": "d4e5f6..."
      }
    ]
  }],
  "notFound": []
}, "0"]]
]]></sourcecode></figure>

<t>The <spanx style="verb">position</spanx> values show where each chunk fits in the assembled
blob, and the <spanx style="verb">digest:sha-256</spanx> values can be used to verify chunk
integrity.</t>

</section>
<section anchor="creating-a-zip-archive"><name>Creating a Zip Archive</name>

<t>This example creates a zip file containing an HTML document, a CSS
file, and a JPEG image:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "create": {
    "z1": {
      "archive": {
        "type": "application/zip",
        "entries": [
          {
            "name": "site/index.html",
            "blobId": "Baaaa"
          },
          {
            "name": "site/style.css",
            "blobId": "Bbbbb"
          },
          {
            "name": "site/photo.jpg",
            "blobId": "Bcccc"
          }
        ]
      }
    }
  }
}, "0"]]
]]></sourcecode></figure>

<t>The response includes the blobId, type, and size of the created
archive:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "created": {
    "z1": {
      "id": "B9f2a4e",
      "type": "application/zip",
      "size": 104857
    }
  },
  "notCreated": {}
}, "0"]]
]]></sourcecode></figure>

</section>
<section anchor="creating-a-compressed-tar-archive"><name>Creating a Compressed Tar Archive</name>

<t>This example creates a .tar.gz file from the same three files.
The intermediate tar blob uses <spanx style="verb">noPersist</spanx> since only the final
compressed result is needed:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "create": {
    "t1": {
      "noPersist": true,
      "archive": {
        "type": "application/x-tar",
        "entries": [
          {
            "name": "site/index.html",
            "blobId": "Baaaa",
            "modified": "2026-03-01T12:00:00Z",
            "mode": "0644"
          },
          {
            "name": "site/style.css",
            "blobId": "Bbbbb",
            "modified": "2026-03-01T12:00:00Z",
            "mode": "0644"
          },
          {
            "name": "site/photo.jpg",
            "blobId": "Bcccc",
            "modified": "2026-02-15T09:30:00Z",
            "mode": "0644"
          }
        ]
      }
    },
    "t2": {
      "compress": {
        "blobId": "#t1",
        "type": "application/gzip"
      }
    }
  }
}, "0"]]
]]></sourcecode></figure>

<t>Because "t1" was created with <spanx style="verb">noPersist</spanx>, the server may omit it
from the response:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "created": {
    "t2": {
      "id": "Bd81c7f",
      "type": "application/gzip",
      "size": 98304
    }
  },
  "notCreated": {}
}, "0"]]
]]></sourcecode></figure>

</section>
<section anchor="extracting-a-compressed-tar-archive"><name>Extracting a Compressed Tar Archive</name>

<t>This example decompresses and extracts a .tar.gz file to discover
its contents.  The intermediate decompressed tar blob uses
<spanx style="verb">noPersist</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "create": {
    "u1": {
      "noPersist": true,
      "unCompress": {
        "blobId": "Bd81c7f",
        "type": "application/gzip"
      }
    },
    "u2": {
      "unArchive": {
        "blobId": "#u1",
        "type": "application/x-tar"
      }
    }
  }
}, "0"]]
]]></sourcecode></figure>

<t>The response for the UnArchiveRecipe includes the standard creation
response properties plus an <spanx style="verb">entries</spanx> array listing the archive
contents, with a blobId for each file entry:</t>

<figure><sourcecode type="json"><![CDATA[
[["Blob/convert", {
  "accountId": "abc",
  "created": {
    "u2": {
      "id": "Be3a901",
      "type": "application/x-tar",
      "size": 102400,
      "entries": [
        {
          "name": "site/index.html",
          "blobId": "Bdd001",
          "entryType": "file",
          "modified": "2026-03-01T12:00:00Z",
          "mode": "0644"
        },
        {
          "name": "site/style.css",
          "blobId": "Bdd002",
          "entryType": "file",
          "modified": "2026-03-01T12:00:00Z",
          "mode": "0644"
        },
        {
          "name": "site/photo.jpg",
          "blobId": "Bdd003",
          "entryType": "file",
          "modified": "2026-02-15T09:30:00Z",
          "mode": "0644"
        }
      ]
    }
  },
  "notCreated": {}
}, "0"]]
]]></sourcecode></figure>

<t>The returned blobIds ("Bdd001", "Bdd002", "Bdd003") can be used
to download individual files or as inputs to further Blob/convert
operations.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>All security considerations from <xref target="JMAP-CORE"/> and <xref target="JMAP-BLOB"/> apply
to this document.</t>

<section anchor="resource-consumption"><name>Resource Consumption</name>

<t>Several operations defined in this document can consume significant
server resources.</t>

<t>Archive and compression operations may require substantial CPU and
memory.  Servers <bcp14>SHOULD</bcp14> impose reasonable limits on archive size,
number of entries, nesting depth of archives within archives,
compression ratios (to mitigate zip bomb attacks), and total
processing time.  Servers <bcp14>SHOULD</bcp14> reject requests that would exceed
these limits with a "tooLarge" or "serverFail" error as appropriate.</t>

<t>Image conversion can also consume significant resources, especially
for very large images or high output dimensions.</t>

<t>The rdiff operations can also be resource-intensive, particularly
for large blobs.  Servers <bcp14>SHOULD</bcp14> impose limits on the size of blobs
that can be used as inputs to rdiff operations.</t>

<t>Servers <bcp14>SHOULD</bcp14> advertise their limits via the <spanx style="verb">maxConvertSize</spanx>,
<spanx style="verb">maxArchiveEntries</spanx>, and <spanx style="verb">maxImageDimension</spanx> capability properties
so that clients can avoid making requests that will be rejected.
Even when these properties are not advertised, servers <bcp14>SHOULD</bcp14> set
sensible internal limits and reject requests that exceed them.</t>

</section>
<section anchor="archive-path-traversal"><name>Archive Path Traversal</name>

<t>Archive formats allow entry names containing path separators and
relative path components such as "../".  Malicious archives may use
names like "../../etc/passwd" to attempt directory traversal.  While
UnArchiveRecipe only returns entry metadata and blob references
(not files on the server filesystem), clients that extract archive
contents to a filesystem <bcp14>MUST</bcp14> validate entry names and reject or
sanitize paths containing ".." components or absolute paths.
Servers <bcp14>SHOULD</bcp14> reject ArchiveRecipe requests containing entry names
with ".." path components.</t>

</section>
<section anchor="content-smuggling"><name>Content Smuggling</name>

<t>The ability to split content into multiple blobs, recombine them via
Blob/upload, and apply rdiff patches may be used to bypass security
scanners that inspect blob content.  Servers that perform content
scanning <bcp14>SHOULD</bcp14> scan the output of Blob/convert operations as well
as the inputs.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="jmap-capability-registration-for-urnietfparamsjmapblobext"><name>JMAP Capability Registration for urn:ietf:params:jmap:blobext</name>

<t>IANA is requested to register the "Blob Extended" Capability as follows:</t>

<t>Capability Name: urn:ietf:params:jmap:blobext</t>

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Specification document: this document</t>

<t>Security and privacy considerations: this document, Security Considerations</t>

</section>
<section anchor="jmap-error-code-registrations"><name>JMAP Error Code Registrations</name>

<t>IANA is requested to register the following entries in the "JMAP
Error Codes" registry:</t>

<section anchor="unknownformat"><name>unknownFormat</name>

<t>JMAP Error Code: unknownFormat</t>

<t>Intended use: common</t>

<t>Change Controller: IETF</t>

<t>Description: The server could not determine the format of the blob,
or the detected format is not supported.  This error is returned
when auto-detection of archive or compression format fails, or when
the blob content does not match the specified format.</t>

<t>Reference: this document</t>

</section>
</section>
</section>
<section anchor="changes"><name>Changes</name>

<t>EDITOR: please remove this section before publication.</t>

<t>The source of this document exists on github at: https://github.com/brong/draft-gondwana-jmap-blobext/</t>

<t><strong>draft-gondwana-jmap-blobext-01</strong></t>

<t><list style="symbols">
  <t>Added Blob/convert method with recipes for image conversion, archiving,
compression, and rdiff.</t>
  <t>Added noPersist option to Blob/upload and Blob/convert for ephemeral
intermediate blobs in pipelines.</t>
  <t>Removed rdiffSignature and rdiffPatch from Blob/get and DataSourceObject.</t>
  <t>Fleshed out capability object with supported type lists.</t>
  <t>Added capability and method examples.</t>
  <t>Expanded Security Considerations.</t>
  <t>Updated IANA registrations with error codes and corrected capability URI.</t>
  <t>Added limit capability properties: maxConvertSize, maxArchiveEntries,
maxImageDimension, and supportsRdiff.</t>
  <t>Added dependency resolution requirement for Blob/convert create map
with cycle detection.</t>
  <t>Now updates both RFC 8620 and RFC 9404.</t>
</list></t>

<t><strong>draft-gondwana-jmap-blobext-00</strong></t>

<t><list style="symbols">
  <t>initial proposal</t>
</list></t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>TODO</t>

<t>{backmatter}</t>

</section>


  </middle>

  <back>



    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="URI-TEMPLATE">
  <front>
    <title>URI Template</title>
    <author fullname="J. Gregorio" initials="J." surname="Gregorio"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="M. Hadley" initials="M." surname="Hadley"/>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <author fullname="D. Orchard" initials="D." surname="Orchard"/>
    <date month="March" year="2012"/>
    <abstract>
      <t>A URI Template is a compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion. This specification defines the URI Template syntax and the process for expanding a URI Template into a URI reference, along with guidelines for the use of URI Templates on the Internet. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6570"/>
  <seriesInfo name="DOI" value="10.17487/RFC6570"/>
</reference>

<reference anchor="JMAP-CORE">
  <front>
    <title>The JSON Meta Application Protocol (JMAP)</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="July" year="2019"/>
    <abstract>
      <t>This document specifies a protocol for clients to efficiently query, fetch, and modify JSON-based data objects, with support for push notification of changes and fast resynchronisation and for out-of- band binary data upload/download.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8620"/>
  <seriesInfo name="DOI" value="10.17487/RFC8620"/>
</reference>

<reference anchor="JMAP-BLOB">
  <front>
    <title>JSON Meta Application Protocol (JMAP) Blob Management Extension</title>
    <author fullname="B. Gondwana" initials="B." role="editor" surname="Gondwana"/>
    <date month="August" year="2023"/>
    <abstract>
      <t>The JSON Meta Application Protocol (JMAP) base protocol (RFC 8620) provides the ability to upload and download arbitrary binary data via HTTP POST and GET on a defined endpoint. This binary data is called a "blob".</t>
      <t>This extension adds additional ways to create and access blobs by making inline method calls within a standard JMAP request.</t>
      <t>This extension also adds a reverse lookup mechanism to discover where blobs are referenced within other data types.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9404"/>
  <seriesInfo name="DOI" value="10.17487/RFC9404"/>
</reference>

<reference anchor="MEDIA-TYPES">
  <front>
    <title>Media Type Specifications and Registration Procedures</title>
    <author fullname="N. Freed" initials="N." surname="Freed"/>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <date month="January" year="2013"/>
    <abstract>
      <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="13"/>
  <seriesInfo name="RFC" value="6838"/>
  <seriesInfo name="DOI" value="10.17487/RFC6838"/>
</reference>


<reference anchor="HTTP-RESUMABLE-UPLOADS">
   <front>
      <title>Resumable Uploads for HTTP</title>
      <author fullname="Marius Kleidl" initials="M." surname="Kleidl">
         <organization>Transloadit</organization>
      </author>
      <author fullname="Guoye Zhang" initials="G." surname="Zhang">
         <organization>Apple Inc.</organization>
      </author>
      <author fullname="Lucas Pardue" initials="L." surname="Pardue">
         <organization>Cloudflare</organization>
      </author>
      <date day="2" month="March" year="2026"/>
      <abstract>
	 <t>   HTTP data transfers can encounter interruption due to reasons such as
   canceled requests or dropped connections.  If the intended recipient
   can indicate how much of the data was received prior to interruption,
   a sender can resume data transfer at that point instead of attempting
   to transfer all of the data again.  HTTP range requests support this
   concept of resumable downloads from server to client.  This document
   describes a mechanism that supports resumable uploads from client to
   server using HTTP.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-resumable-upload-11"/>
   
</reference>

<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>

<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>




    </references>





  </back>

<!-- ##markdown-source:
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
F4gAAA==

-->

</rfc>

