<?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-ietf-jmap-conditional-00" category="std" consensus="true" submissionType="IETF" updates="8620" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="JMAP Conditional">JMAP Conditional Set</title>

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

    <date year="2026" month="September" day="15"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 30?>

<t>The JMAP base protocol (<xref target="JMAP-CORE"/>) provides the Foo/set method for
creating, updating, and destroying objects.  It offers a single concurrency
control, the "ifInState" argument, which guards an entire object type: if any
object of that type has changed, the whole method is rejected.</t>

<t>This extension adds a finer, per-object conditional mechanism.  A client may
require that an individual update or destroy proceed only if the target object
still matches a set of expected property values, expressed using the JMAP
PatchObject already defined for updates.  This provides optimistic concurrency
control scoped to a single object — the equivalent of an HTTP "If-Match"
precondition — for any JMAP data type.</t>

<t>This extension also defines an optional "atomic" argument that applies an
entire Foo/set as a single unit: either every change it requests takes effect,
or none does.  Combined with the per-object precondition, this lets a client
express a multi-object change that is safe only when applied together — such as
an atomic rename that exchanges two names.</t>



    </abstract>



  </front>

  <middle>


<?line 50?>

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

<t>The Foo/set method defined in <xref target="JMAP-CORE"/> is the mechanism by which clients
create, update, and destroy objects.  It provides one form of concurrency
control: the optional "ifInState" argument, which aborts the entire method if
the account's state string for that data type does not match the value the
client supplies.</t>

<t>This guard is coarse.  The state string changes whenever <em>any</em> object of that
type changes, by any client.  In a busy account — or one that receives
server-initiated changes, such as the arrival of new mail — the state can
change between a client's read and its write for reasons entirely unrelated to
the object the client is modifying.  Using "ifInState" to protect a single
update therefore leads to frequent spurious rejections and retries.</t>

<t>Clients commonly need a narrower guarantee: "apply this change only if the
specific object I read still holds the values I depend on".  This is the same
need met by the HTTP "If-Match" precondition (<xref target="HTTP-SEMANTICS"/>) and the
entity-tag model of WebDAV (<xref target="WEBDAV"/>): a conditional write scoped to a single
resource.</t>

<t>This document defines a generic, per-object conditional mechanism for Foo/set.
It introduces no new properties and no new version tokens.  Instead it reuses
the PatchObject already defined by <xref target="JMAP-CORE"/> for updates: a client states
its precondition as a PatchObject describing the values it expects the object
to currently hold, and the server performs the change only if applying that
patch would change nothing.</t>

<t>Because the mechanism is defined entirely in terms of an object's properties
and the existing PatchObject semantics, it applies uniformly to every data
type that implements Foo/set, with no per-type additions.</t>

<t>A second, related need is atomicity.  <xref target="JMAP-CORE"/> processes the creations,
updates, and destroys within a Foo/set independently: some may succeed while
others fail, and the method gives no guarantee that a set of related changes
takes effect together.  The only all-or-nothing control Core offers is
"ifInState", which — like the concurrency problem above — is scoped to the
entire object type rather than to the changes the client actually requested.
This document therefore also defines an optional "atomic" argument that commits
a Foo/set as a single unit, evaluated against the state that results from
applying all of its changes together (see <xref target="atomic"/>).</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?>

<t>The terms "Id", "PatchObject", "SetError", and "Foo/set" are defined in
<xref target="JMAP-CORE"/>.  A "pointer" is a JSON Pointer as used within a PatchObject
(see <xref target="JMAP-CORE"/>, Section 5.3).</t>

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

<section anchor="urnietfparamsjmapconditional"><name>urn:ietf:params:jmap:conditional</name>

<t>The presence of the "urn:ietf:params:jmap:conditional" property in the
"capabilities" object of the JMAP Session resource indicates support for the
conditional Foo/set behaviour defined in this document.  The value of this
property <bcp14>MUST</bcp14> be an empty object.</t>

<t>A client indicates that it wishes to use this extension by including the
capability URI in the "using" array of a request.  When a server that
advertises this capability receives a request whose "using" array includes
this URI, it <bcp14>MUST</bcp14> honour the "ifUnchangedBy" argument (<xref target="conditional-set"/>) on
every Foo/set method it implements.  It <bcp14>MUST</bcp14> also honour the "atomic" argument
(<xref target="atomic"/>): either applying the method atomically, or, if it cannot, rejecting
it with a "cannotApplyAtomically" error (<xref target="atomic"/>).  A server <bcp14>MUST NOT</bcp14> apply
the changes of a method requested with "atomic" only in part.</t>

<t>The capability is generic: it does not depend on any particular data type, and
its presence applies to all types for which the server implements Foo/set.</t>

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

<figure><artwork><![CDATA[
"urn:ietf:params:jmap:conditional": {}
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="conditional-set"><name>Conditional Foo/set</name>

<t>This document adds the following arguments to the standard Foo/set method
(<xref target="JMAP-CORE"/>, Section 5.3):</t>

<t><list style="symbols">
  <t>ifUnchangedBy: "Id[PatchObject]" (default: an empty object)  <vspace blankLines='1'/>
A map of object id to a PatchObject expressing a precondition on that
object.  For each entry, the precondition is satisfied if and only if
applying the given PatchObject to the current server-side object would
leave the object unchanged.  <vspace blankLines='1'/>
Equivalently: for every pointer in the PatchObject, the object's current
value at that pointer <bcp14>MUST</bcp14> equal the value given in the PatchObject.  A
JSON "null" value matches a property that is not present (it asserts that
removing the property would be a no-op).  Comparison uses the same
representation the server would return for that property from Foo/get.</t>
  <t>atomic: "Boolean" (default: false)  <vspace blankLines='1'/>
If true, the Foo/set is applied as a single unit: the server <bcp14>MUST</bcp14> either
commit every creation, update, and destroy the method requests, or make no
change at all.  See <xref target="atomic"/>.</t>
</list></t>

<section anchor="evaluation-rules"><name>Evaluation Rules</name>

<t><list style="numbers" type="1">
  <t>Preconditions are evaluated against the state of each object as it exists
at the start of the method, before any create, update, or destroy in the
same method is applied.</t>
  <t>Each key in "ifUnchangedBy" is the id of an object of the same type as the
method (the "Foo" of "Foo/set").  The object need not be one the method
changes.  A client <bcp14>MAY</bcp14> set a precondition on an object the method does not
change, for example its parent.  A precondition is not satisfied if its
object does not exist, or is not visible to the client.  The server then
handles it as in <xref target="effect"/>.  A creation id (an id prefixed with "#") <bcp14>MAY</bcp14>
be a key.  It references an object created by an earlier method call in the
same request (<xref target="JMAP-CORE"/>, Section 5.3).  If the creation id resolves to
an object of a different type, the server <bcp14>MUST</bcp14> reject the whole method with
an "invalidArguments" error.  This lets a client require that an object it
created earlier in the request has not changed since then.</t>
  <t>Unlike the PatchObject supplied in the "update" argument, which may only
reference properties the client is permitted to set, the PatchObject in
"ifUnchangedBy" <bcp14>MAY</bcp14> reference any property of the object, including
server-set and otherwise read-only properties (for example a content
identifier, a size, or a server-maintained change timestamp).  This allows
a client to condition a change on properties it cannot itself modify.</t>
  <t>If a pointer in an "ifUnchangedBy" PatchObject is not a valid pointer for
the object's type, or the PatchObject is otherwise malformed, the server
<bcp14>MUST</bcp14> reject the whole method with an "invalidArguments" error.</t>
  <t>The "ifUnchangedBy" and "ifInState" arguments are both method-level guards
and compose.  If both are supplied, the server checks "ifInState" first and
then the "ifUnchangedBy" preconditions; if either does not hold, the method
is rejected with a "stateMismatch" error and no change is made.</t>
</list></t>

</section>
<section anchor="effect"><name>Effect</name>

<t>If every precondition in "ifUnchangedBy" is satisfied, the method proceeds
exactly as it would without this extension.</t>

<t>If any precondition is not satisfied, the server <bcp14>MUST</bcp14> make no change — no
creation, update, or destroy in the method takes effect — and <bcp14>MUST</bcp14> reject the
whole method with a method-level "stateMismatch" error (<xref target="statemismatch"/>).
The state string for the type <bcp14>MUST</bcp14> be unchanged.</t>

<t>This is all-or-nothing at the method level, by design: a single Foo/set is
the unit of conditional application.  A client that wants changes to succeed or
fail independently of one another places them in separate method calls within
the same request, each with its own "ifUnchangedBy".</t>

</section>
<section anchor="statemismatch"><name>The "stateMismatch" error</name>

<t>A failed "ifUnchangedBy" precondition is reported using the method-level
"stateMismatch" error already defined by <xref target="JMAP-CORE"/> for a failed "ifInState"
guard.  It is returned as an "error" response in place of the Foo/set response,
so no create, update, or destroy result is returned and the client knows the
method made no change.</t>

<t>The error discloses no object data: a client that needs the current values
fetches them with Foo/get or Foo/changes before deciding how to proceed.  A
server <bcp14>MAY</bcp14> include a "description" for debugging, and <bcp14>MAY</bcp14> include:</t>

<t><list style="symbols">
  <t>failed: "Id[]"  <vspace blankLines='1'/>
The ids of the objects whose preconditions were not satisfied.  This lets a
client re-fetch only what it needs, without disclosing any values.  A server
that does not wish to distinguish which precondition failed <bcp14>MAY</bcp14> omit this
property.</t>
</list></t>

</section>
</section>
<section anchor="atomic"><name>Atomic Foo/set</name>

<t>When the "atomic" argument is true, the server <bcp14>MUST</bcp14> apply the Foo/set as a
single unit: either every creation, update, and destroy the method requests
takes effect, or none of them does.</t>

<section anchor="evaluation"><name>Evaluation</name>

<t>The server evaluates the method as though all of its changes were applied
together.  Any constraint that <xref target="JMAP-CORE"/> or a data-type extension evaluates
on the resulting object set — for example a uniqueness constraint on a name
within a parent — is checked once, against the state produced by applying all
the changes, not against any intermediate state.</t>

<t>This is what lets a set of changes that is valid only as a whole succeed.  For
example, exchanging two names — renaming object A to the name currently held by
B and B to the name currently held by A — collides if applied one change at a
time, but the combined result is conflict-free (see <xref target="exchange"/>).</t>

</section>
<section anchor="failure"><name>Failure</name>

<t>If any part of an atomic method fails — an invalid patch, a name collision, a
permission error, a violated constraint, or any other SetError that would place
an id in "notCreated", "notUpdated", or "notDestroyed" — the server <bcp14>MUST</bcp14> make
no change and <bcp14>MUST</bcp14> reject the whole method with a method-level "atomicFailure"
error.  The state string for the type <bcp14>MUST</bcp14> be unchanged.</t>

<t>A failed "ifUnchangedBy" precondition is reported as a "stateMismatch" error
(<xref target="statemismatch"/>) whether or not "atomic" is set; preconditions are already
all-or-nothing at the method level.  The "atomicFailure" error is specific to
the method's own creations, updates, and destroys not being committable
together.</t>

<t>The "atomicFailure" error object <bcp14>MAY</bcp14> carry "notCreated", "notUpdated", and
"notDestroyed" maps — of the same form as a Foo/set response — identifying the
ids whose processing failed and the SetError for each.  Ids that would have
succeeded are omitted; they were not committed, because the method as a whole
was rejected.  A server <bcp14>MAY</bcp14> report only the first failure it encounters.</t>

</section>
<section anchor="cannotapply"><name>Servers That Cannot Apply Atomically</name>

<t>A server that advertises this capability but cannot apply a given method
atomically — either at all, or because this particular method is beyond what it
can commit as a unit — <bcp14>MUST</bcp14> reject the method with a method-level
"cannotApplyAtomically" error and make no change.  It <bcp14>MUST NOT</bcp14> fall back to
applying the changes non-atomically.</t>

<t>A client that receives "cannotApplyAtomically" <bcp14>MAY</bcp14> retry without "atomic" if it
can tolerate partial application, or surface the failure otherwise.  A client
that does not recognise the error treats it as "serverFail" (<xref target="JMAP-CORE"/>):
since a rejected atomic method makes no change, this fallback is safe, if less
informative.</t>

</section>
<section anchor="force-with-lease-on-file-content"><name>Force-with-lease on file content</name>

<t>A client last synchronised a file node "f42" with content blob "G_old".  It has
since produced new content "G_new", and wishes to replace the content only if no
other client has changed it in the meantime.  It conditions on the server-set
"blobId" (<xref target="JMAP-FILENODE"/>):</t>

<figure><artwork><![CDATA[
[[ "FileNode/set", {
  "accountId": "u1",
  "ifUnchangedBy": { "f42": { "blobId": "G_old" } },
  "update":       { "f42": { "blobId": "G_new",
                             "modified": "2026-05-01T09:30:00Z" } }
}, "0" ]]
]]></artwork></figure>

<t>If "f42" still references "G_old", the update succeeds.  If another client has
already replaced the content (so "blobId" is now, say, "G_other"), the
precondition fails and the server makes no change, returning a method-level
"stateMismatch" error:</t>

<figure><artwork><![CDATA[
[[ "error", {
  "type": "stateMismatch",
  "failed": [ "f42" ]
}, "0" ]]
]]></artwork></figure>

<t>The client fetches "f42", resolves the conflict (for instance by preserving its
own version as a separate file), and retries.</t>

</section>
<section anchor="conditional-destroy"><name>Conditional destroy</name>

<t>Destroy a message only if it has not been read on another device.  In
<xref target="JMAP-MAIL"/>, an unread message has no "$seen" keyword, so the client asserts
that "keywords/$seen" is absent:</t>

<figure><artwork><![CDATA[
[[ "Email/set", {
  "accountId": "u1",
  "ifUnchangedBy": { "M7": { "keywords/$seen": null } },
  "destroy":      [ "M7" ]
}, "0" ]]
]]></artwork></figure>

<t>If the message has since been marked "$seen", the precondition fails, the whole
method is rejected with a "stateMismatch" error, and "M7" is not deleted.</t>

</section>
<section anchor="a-condition-that-ignores-unrelated-changes"><name>A condition that ignores unrelated changes</name>

<t>Because the precondition references only the pointers the client supplies,
concurrent changes to other properties of the same object do not cause it to
fail.  Here a client removes a grantee's access, but only if that grantee
currently holds exactly the rights the client saw:</t>

<figure><artwork><![CDATA[
[[ "FileNode/set", {
  "accountId": "u1",
  "ifUnchangedBy": { "d3": { "shareWith/bob/mayRead": true } },
  "update":       { "d3": { "shareWith/bob": null } }
}, "0" ]]
]]></artwork></figure>

<t>The change applies only if Bob currently has "mayRead" of "true".  A concurrent
change to an unrelated property of "d3" (its name, or another grantee's rights)
does not trigger a "stateMismatch".</t>

</section>
<section anchor="conditioning-on-an-object-the-method-does-not-change"><name>Conditioning on an object the method does not change</name>

<t>A precondition may name an object the method is not creating, updating, or
destroying.  Here a client updates the content of file "f42", but only if it is
still in the parent directory the client last saw ("d3"), so the write does not
land in an unexpected place after a concurrent move:</t>

<figure><artwork><![CDATA[
[[ "FileNode/set", {
  "accountId": "u1",
  "ifUnchangedBy": { "f42": { "parentId": "d3" },
                     "d3":  { "name": "Reports" } },
  "update":       { "f42": { "blobId": "G_new",
                             "modified": "2026-05-01T09:30:00Z" } }
}, "0" ]]
]]></artwork></figure>

<t>If either "f42" has been reparented or "d3" has been renamed, the method is
rejected with a "stateMismatch" error and the content is not written, even
though "d3" itself is not being changed.</t>

</section>
<section anchor="whole-object-compare-and-swap"><name>Whole-object compare-and-swap</name>

<t>A data type that maintains a server-set change token can be used to require
that nothing at all has changed.  For example, a type with a server-maintained
"changed" timestamp that is updated on every modification:</t>

<figure><artwork><![CDATA[
"ifUnchangedBy": { "f42": { "changed": "2026-04-30T12:00:00Z" } }
]]></artwork></figure>

<t>Because the server updates "changed" on any modification to the object, this
asserts that the entire object is unchanged since the client last read it,
recovering the coarse "If-Match" behaviour as a special case of the general
mechanism.</t>

</section>
<section anchor="exchange"><name>Atomic exchange of two names</name>

<t>Two file nodes, "a" (named "current.txt") and "b" (named "previous.txt"), are
to swap names.  Applied one at a time, either rename collides with the name the
other still holds; applied together, the result is conflict-free.  With
"atomic" set, the rule that sibling names are unique is evaluated only against
the resulting state:</t>

<figure><artwork><![CDATA[
[[ "FileNode/set", {
  "accountId": "u1",
  "atomic": true,
  "update": {
    "a": { "name": "previous.txt" },
    "b": { "name": "current.txt" }
  }
}, "0" ]]
]]></artwork></figure>

<t>Both renames take effect, or — if either is rejected for any reason — neither
does, and the server returns an "atomicFailure" error identifying the offending
id.</t>

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

<section anchor="jmap-capability-registration-for-conditional"><name>JMAP Capability Registration for "conditional"</name>

<t>IANA is requested to register the "conditional" JMAP Capability as follows, in
the "JMAP Capabilities" registry established by <xref target="JMAP-CORE"/>:</t>

<dl>
  <dt>Capability Name:</dt>
  <dd>
    <t>urn:ietf:params:jmap:conditional</t>
  </dd>
  <dt>Specification document:</dt>
  <dd>
    <t>this document</t>
  </dd>
  <dt>Intended use:</dt>
  <dd>
    <t>common</t>
  </dd>
  <dt>Change Controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
  <dt>Security and privacy considerations:</dt>
  <dd>
    <t>this document, <xref target="security"/></t>
  </dd>
</dl>

</section>
<section anchor="jmap-error-code-registration-for-atomicfailure"><name>JMAP Error Code Registration for "atomicFailure"</name>

<t>IANA is requested to register the "atomicFailure" JMAP Error Code in the "JMAP
Error Codes" registry established by <xref target="JMAP-CORE"/>:</t>

<dl>
  <dt>JMAP Error Code:</dt>
  <dd>
    <t>atomicFailure</t>
  </dd>
  <dt>Intended use:</dt>
  <dd>
    <t>common</t>
  </dd>
  <dt>Change Controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
  <dt>Description:</dt>
  <dd>
    <t>A Foo/set requested with "atomic" set to true could not commit all of its
changes together; no change was made.  Returned as a method-level error.</t>
  </dd>
  <dt>Reference:</dt>
  <dd>
    <t>this document</t>
  </dd>
</dl>

</section>
<section anchor="jmap-error-code-registration-for-cannotapplyatomically"><name>JMAP Error Code Registration for "cannotApplyAtomically"</name>

<t>IANA is requested to register the "cannotApplyAtomically" JMAP Error Code in
the "JMAP Error Codes" registry established by <xref target="JMAP-CORE"/>:</t>

<dl>
  <dt>JMAP Error Code:</dt>
  <dd>
    <t>cannotApplyAtomically</t>
  </dd>
  <dt>Intended use:</dt>
  <dd>
    <t>common</t>
  </dd>
  <dt>Change Controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
  <dt>Description:</dt>
  <dd>
    <t>A Foo/set was requested with "atomic" set to true, but the server cannot
apply this method atomically; no change was made.  Returned as a method-level
error.</t>
  </dd>
  <dt>Reference:</dt>
  <dd>
    <t>this document</t>
  </dd>
</dl>

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

<section anchor="information-disclosure"><name>Information Disclosure</name>

<t>The conditional mechanism returns no object data.  A failed precondition yields
only a "stateMismatch" error, optionally naming the ids whose preconditions did
not hold, but never their values — nothing beyond what the client could already
obtain by reading the objects with Foo/get.</t>

<t>A precondition does not bypass access control.  A server <bcp14>MUST</bcp14> require the same
permissions to read the properties referenced in an "ifUnchangedBy" PatchObject
as it would to return them from Foo/get.  In particular, a server <bcp14>MUST NOT</bcp14>
evaluate a precondition on a property the requesting client is not permitted to
read; such a condition <bcp14>MUST</bcp14> cause the method to fail with a "forbidden" error,
so that the mechanism cannot be used as an oracle to probe the values of
properties the client cannot otherwise see.</t>

</section>
<section anchor="atomic-methods-and-resource-consumption"><name>Atomic Methods and Resource Consumption</name>

<t>Applying a method atomically may require the server to hold a transaction, or
equivalent locks, across all of its changes, and so a very large atomic Foo/set
can hold resources longer than the same changes made independently.  The limits
a server already applies to the number of objects in a single Foo/set
(<xref target="JMAP-CORE"/>) continue to apply, and a server <bcp14>MAY</bcp14> reject an atomic method it
considers too large rather than attempt it.</t>

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

<t>Evaluating a precondition is comparable in cost to validating an update
PatchObject and imposes no significant additional load.</t>

</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-conditional/</t>

<t><strong>draft-ietf-jmap-conditional-00</strong></t>

<t><list style="symbols">
  <t>Upload with working-group adopted name.</t>
</list></t>

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

<t><list style="symbols">
  <t>Added the "atomic" argument to Foo/set: a method requested with "atomic" is
applied as a single unit, with constraints evaluated against the resulting
state (enabling changes valid only as a whole, such as an atomic name
exchange).</t>
  <t>Added the "atomicFailure" method-level error (the method's changes could not
be committed together) and the "cannotApplyAtomically" method-level error
(the server cannot apply the method atomically), both registered with IANA.
A server <bcp14>MUST NOT</bcp14> apply an atomic method's changes only in part.</t>
  <t>Generalised "ifUnchangedBy" to allow a precondition on any object of the
method's type, including objects the method does not itself create, update,
or destroy (for example a parent or container).</t>
  <t>Changed the effect of a failed precondition from a per-object "stateMismatch"
SetError to a method-level "stateMismatch" error that rejects the whole
method and makes no change; a client wanting independent application uses
separate method calls.  Removed the bespoke per-object SetError definition in
favour of Core's method-level "stateMismatch", optionally carrying the
"failed" ids.</t>
</list></t>

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

<t><list style="symbols">
  <t>Initial proposal.</t>
</list></t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

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



<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="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>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="JMAP-MAIL">
  <front>
    <title>The JSON Meta Application Protocol (JMAP) for Mail</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="August" year="2019"/>
    <abstract>
      <t>This document specifies a data model for synchronising email data with a server using the JSON Meta Application Protocol (JMAP). Clients can use this to efficiently search, access, organise, and send messages, and to get push notifications for fast resynchronisation when new messages are delivered or a change is made in another client.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8621"/>
  <seriesInfo name="DOI" value="10.17487/RFC8621"/>
</reference>

<reference anchor="HTTP-SEMANTICS">
  <front>
    <title>HTTP Semantics</title>
    <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
    <date month="June" year="2022"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
      <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="97"/>
  <seriesInfo name="RFC" value="9110"/>
  <seriesInfo name="DOI" value="10.17487/RFC9110"/>
</reference>

<reference anchor="WEBDAV">
  <front>
    <title>HTTP Extensions for Web Distributed Authoring and Versioning (WebDAV)</title>
    <author fullname="L. Dusseault" initials="L." role="editor" surname="Dusseault"/>
    <date month="June" year="2007"/>
    <abstract>
      <t>Web Distributed Authoring and Versioning (WebDAV) consists of a set of methods, headers, and content-types ancillary to HTTP/1.1 for the management of resource properties, creation and management of resource collections, URL namespace manipulation, and resource locking (collision avoidance).</t>
      <t>RFC 2518 was published in February 1999, and this specification obsoletes RFC 2518 with minor revisions mostly due to interoperability experience. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4918"/>
  <seriesInfo name="DOI" value="10.17487/RFC4918"/>
</reference>


<reference anchor="JMAP-FILENODE">
   <front>
      <title>JMAP File Storage extension</title>
      <author fullname="Bron Gondwana" initials="B." surname="Gondwana">
         <organization>Fastmail</organization>
      </author>
      <date day="15" month="May" year="2026"/>
      <abstract>
	 <t>   The JMAP base protocol (RFC8620) provides the ability to upload and
   download arbitrary binary data.  This binary data is called a &quot;blob&quot;,
   and can be used in all other JMAP extensions.

   This extension adds a method to expose blobs as a filesystem along
   with the types of metadata that are provided by other remote
   filesystem protocols.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-filenode-14"/>
   
</reference>




    </references>

</references>



  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA81c63IbyXX+30/RgVK1kgqgSK1s70IuOxRFeelaXSJS2XJk
lauBaZBjDWbg6QEpRCVXHiIPkGfJo+RJcr5zTvf0ABClde2P6IcIDGb6cq7f
ufRMJhPTlV3lp/aPz49f2ZOmLsqubGpX2XPfGTebtf5690dTNPPaLemxonWL
blL6bjH569KtJvP+psnhoQnr2bIMgb5fbFZ0+9npxTMzd52/bNrN1IauMOtV
Qd/D1H7364eHppmFpvL4bspVO7Vduw7dw8PD7w8fmvd+c9O0BY1Sd76tfTd5
itlN6Fxd/MVVTU0zbHwwq3Jq33bNfGxD03atXwT6tFniwztj3Lq7atqpsRNj
6V9Z09xPDuwfaOU3rnZ8UTb3pG3q4fWmvZzaZy50S1dWfMXj09TO6NbLf1no
L513y4N5szSmbtql68prP+W7QcjJycvXp1P7+tkJ79iU9WLPTc+Pz36MNx3x
5R8uLl5Nzk+fH7+4ODs559++Pzo65N9+On3y9Pjf+Nqj74++64d5dvbj6YuX
T2m+s8nTg55Pi7LydVN4YyaTiXWz0LVu3hlzceWF2zMXvF21DZGxqezdjx/T
0j99uocfrsvCB9vR/c+a5kHwnV16ImxhaTdm3nraUH05tsxe/kRMsvRI1zYb
+m6b2V/9vAsH1p51tlksfBuss4F+qrwlMZqv29bX842hz/RMNea5RuXirD7v
SGJG1rWX66Wvu7G9uSrnV/Zy7dqCBqktXSxbr1PYjkWvXNAvG6PXmgUN5+Q3
e+WCnV+5+tIXMsvNFQlh3E8ZbOvxkC8OQCD67j90voZUW1dgRrsoa9+O7cq3
E50gUwQaCKOXYUmbPbbzqqT12aXbmNb/bY2F8lJo3SU9Q3Rd0zOiFiRwkWag
+dz7wjZ1tcFusNCOaECUlzlJEcqKZnPd/MozMT1v1H9Y8eoxAq2w29hrV609
KQX90voQ6Kc1CM9Dgs/mFcZ4KTtxFTGz2NA6sEvmr64OzGN6JHFoVl1JCt+V
830stGFOCyhs1/ScVnL973/+F88OgtDqQKAGDGOpt6OzxeQ5ljQytOBEWn4K
yyHGitTSqhzzdA+nqtDoHlhGsFTmzsh1zbKc9/Kk7FitiFG41ag4RTl3maCu
67KbWl/S2lvrr327UUmyZWfBXmIeaYl7TyN5EvJ5Nza04JpslS0apuBJs5wx
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
xTvjV7RVDJ6a4Cp9ZR8aQsz/AbMlfKj9VQAA

-->

</rfc>

