summaryrefslogtreecommitdiff
path: root/doc/rfc/rfc8984.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/rfc/rfc8984.txt')
-rw-r--r--doc/rfc/rfc8984.txt3987
1 files changed, 3987 insertions, 0 deletions
diff --git a/doc/rfc/rfc8984.txt b/doc/rfc/rfc8984.txt
new file mode 100644
index 0000000..565277c
--- /dev/null
+++ b/doc/rfc/rfc8984.txt
@@ -0,0 +1,3987 @@
+
+
+
+
+Internet Engineering Task Force (IETF) N. Jenkins
+Request for Comments: 8984 R. Stepanek
+Category: Standards Track Fastmail
+ISSN: 2070-1721 July 2021
+
+
+ JSCalendar: A JSON Representation of Calendar Data
+
+Abstract
+
+ This specification defines a data model and JSON representation of
+ calendar data that can be used for storage and data exchange in a
+ calendaring and scheduling environment. It aims to be an alternative
+ and, over time, successor to the widely deployed iCalendar data
+ format. It also aims to be unambiguous, extendable, and simple to
+ process. In contrast to the jCal format, which is also based on
+ JSON, JSCalendar is not a direct mapping from iCalendar but defines
+ the data model independently and expands semantics where appropriate.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 7841.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ https://www.rfc-editor.org/info/rfc8984.
+
+Copyright Notice
+
+ Copyright (c) 2021 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (https://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+Table of Contents
+
+ 1. Introduction
+ 1.1. Motivation and Relation to iCalendar and jCal
+ 1.2. Notational Conventions
+ 1.3. Type Signatures
+ 1.4. Data Types
+ 1.4.1. Id
+ 1.4.2. Int
+ 1.4.3. UnsignedInt
+ 1.4.4. UTCDateTime
+ 1.4.5. LocalDateTime
+ 1.4.6. Duration
+ 1.4.7. SignedDuration
+ 1.4.8. TimeZoneId
+ 1.4.9. PatchObject
+ 1.4.10. Relation
+ 1.4.11. Link
+ 2. JSCalendar Objects
+ 2.1. Event
+ 2.2. Task
+ 2.3. Group
+ 3. Structure of JSCalendar Objects
+ 3.1. Object Type
+ 3.2. Normalization and Equivalence
+ 3.3. Vendor-Specific Property Extensions, Values, and Types
+ 4. Common JSCalendar Properties
+ 4.1. Metadata Properties
+ 4.1.1. @type
+ 4.1.2. uid
+ 4.1.3. relatedTo
+ 4.1.4. prodId
+ 4.1.5. created
+ 4.1.6. updated
+ 4.1.7. sequence
+ 4.1.8. method
+ 4.2. What and Where Properties
+ 4.2.1. title
+ 4.2.2. description
+ 4.2.3. descriptionContentType
+ 4.2.4. showWithoutTime
+ 4.2.5. locations
+ 4.2.6. virtualLocations
+ 4.2.7. links
+ 4.2.8. locale
+ 4.2.9. keywords
+ 4.2.10. categories
+ 4.2.11. color
+ 4.3. Recurrence Properties
+ 4.3.1. recurrenceId
+ 4.3.2. recurrenceIdTimeZone
+ 4.3.3. recurrenceRules
+ 4.3.4. excludedRecurrenceRules
+ 4.3.5. recurrenceOverrides
+ 4.3.6. excluded
+ 4.4. Sharing and Scheduling Properties
+ 4.4.1. priority
+ 4.4.2. freeBusyStatus
+ 4.4.3. privacy
+ 4.4.4. replyTo
+ 4.4.5. sentBy
+ 4.4.6. participants
+ 4.4.7. requestStatus
+ 4.5. Alerts Properties
+ 4.5.1. useDefaultAlerts
+ 4.5.2. alerts
+ 4.6. Multilingual Properties
+ 4.6.1. localizations
+ 4.7. Time Zone Properties
+ 4.7.1. timeZone
+ 4.7.2. timeZones
+ 5. Type-Specific JSCalendar Properties
+ 5.1. Event Properties
+ 5.1.1. start
+ 5.1.2. duration
+ 5.1.3. status
+ 5.2. Task Properties
+ 5.2.1. due
+ 5.2.2. start
+ 5.2.3. estimatedDuration
+ 5.2.4. percentComplete
+ 5.2.5. progress
+ 5.2.6. progressUpdated
+ 5.3. Group Properties
+ 5.3.1. entries
+ 5.3.2. source
+ 6. Examples
+ 6.1. Simple Event
+ 6.2. Simple Task
+ 6.3. Simple Group
+ 6.4. All-Day Event
+ 6.5. Task with a Due Date
+ 6.6. Event with End Time Zone
+ 6.7. Floating-Time Event (with Recurrence)
+ 6.8. Event with Multiple Locations and Localization
+ 6.9. Recurring Event with Overrides
+ 6.10. Recurring Event with Participants
+ 7. Security Considerations
+ 7.1. Expanding Recurrences
+ 7.2. JSON Parsing
+ 7.3. URI Values
+ 7.4. Spam
+ 7.5. Duplication
+ 7.6. Time Zones
+ 8. IANA Considerations
+ 8.1. Media Type Registration
+ 8.2. Creation of the "JSCalendar Properties" Registry
+ 8.2.1. Preliminary Community Review
+ 8.2.2. Submit Request to IANA
+ 8.2.3. Designated Expert Review
+ 8.2.4. Change Procedures
+ 8.2.5. "JSCalendar Properties" Registry Template
+ 8.2.6. Initial Contents for the "JSCalendar Properties"
+ Registry
+ 8.3. Creation of the "JSCalendar Types" Registry
+ 8.3.1. "JSCalendar Types" Registry Template
+ 8.3.2. Initial Contents for the "JSCalendar Types" Registry
+ 8.4. Creation of the "JSCalendar Enum Values" Registry
+ 8.4.1. "JSCalendar Enum Values" Registry Property Template
+ 8.4.2. "JSCalendar Enum Values" Registry Value Template
+ 8.4.3. Initial Contents for the "JSCalendar Enum Values"
+ Registry
+ 9. References
+ 9.1. Normative References
+ 9.2. Informative References
+ Acknowledgments
+ Authors' Addresses
+
+1. Introduction
+
+ This document defines a data model for calendar event and task
+ objects, or groups of such objects, in electronic calendar
+ applications and systems. The format aims to be unambiguous,
+ extendable, and simple to process.
+
+ The key design considerations for this data model are as follows:
+
+ * The attributes of the calendar entry represented must be described
+ as simple key-value pairs. Simple events are simple to represent;
+ complex events can be modeled accurately.
+
+ * Wherever possible, there should be only one way to express the
+ desired semantics, reducing complexity.
+
+ * The data model should avoid ambiguities, which often lead to
+ interoperability issues between implementations.
+
+ * The data model should be generally compatible with the iCalendar
+ data format [RFC5545] [RFC7986] and extensions, but the
+ specification should add new attributes where the iCalendar format
+ currently lacks expressivity, and drop seldom-used, obsolete, or
+ redundant properties. This means translation with no loss of
+ semantics should be easy with most common iCalendar files.
+
+ * Extensions, such as new properties and components, should not
+ require updates to this document.
+
+ The representation of this data model is defined in the Internet JSON
+ (I-JSON) format [RFC7493], which is a strict subset of the JSON data
+ interchange format [RFC8259]. Using JSON is mostly a pragmatic
+ choice: its widespread use makes JSCalendar easier to adopt and the
+ ready availability of production-ready JSON implementations
+ eliminates a whole category of parser-related interoperability
+ issues, which iCalendar has often suffered from.
+
+1.1. Motivation and Relation to iCalendar and jCal
+
+ The iCalendar data format [RFC5545], a widely deployed interchange
+ format for calendaring and scheduling data, has served calendaring
+ vendors for a long time but contains some ambiguities and pitfalls
+ that cannot be overcome without backward-incompatible changes.
+
+ Sources of implementation errors include the following:
+
+ * iCalendar defines various formats for local times, UTC, and dates.
+
+ * iCalendar requires custom time zone definitions within a single
+ calendar component.
+
+ * iCalendar's definition of recurrence rules is ambiguous and has
+ resulted in differing interpretations, even between experienced
+ calendar developers.
+
+ * The iCalendar format itself causes interoperability issues due to
+ misuse of CRLF-terminated strings, line continuations, and subtle
+ differences among iCalendar parsers.
+
+ In recent years, many new products and services have appeared that
+ wish to use a JSON representation of calendar data within their APIs.
+ The JSON format for iCalendar data, jCal [RFC7265], is a direct
+ mapping between iCalendar and JSON. In its effort to represent full
+ iCalendar semantics, it inherits all the same pitfalls and uses a
+ complicated JSON structure.
+
+ As a consequence, since the standardization of jCal, the majority of
+ implementations and service providers either kept using iCalendar or
+ came up with their own proprietary JSON representations, which are
+ incompatible with each other and often suffer from common pitfalls,
+ such as storing event start times in UTC (which become incorrect if
+ the time zone's rules change in the future). JSCalendar meets the
+ demand for JSON-formatted calendar data that is free of such known
+ problems and provides a standard representation as an alternative to
+ the proprietary formats.
+
+1.2. Notational Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
+ capitals, as shown here.
+
+ The underlying format used for this specification is JSON.
+ Consequently, the terms "object" and "array" as well as the four
+ primitive types (strings, numbers, booleans, and null) are to be
+ interpreted as described in Section 1 of [RFC8259].
+
+ Some examples in this document contain "partial" JSON documents used
+ for illustrative purposes. In these examples, an ellipsis "..." is
+ used to indicate a portion of the document that has been removed for
+ compactness.
+
+1.3. Type Signatures
+
+ Type signatures are given for all JSON values in this document. The
+ following conventions are used:
+
+ "*": The type is undefined (the value could be any type, although
+ permitted values may be constrained by the context of this value).
+
+ "String": This is the JSON string type.
+
+ "Number": This is the JSON number type.
+
+ "Boolean": This is the JSON boolean type.
+
+ "A[B]": The keys are all of type "A" and the values are all of type
+ "B" for a JSON object.
+
+ "A[]": There is an array of values of type "A"
+
+ "A|B": The value is either of type "A" or of type "B".
+
+ Other types may also be given; their representations are defined
+ elsewhere in this document.
+
+1.4. Data Types
+
+ In addition to the standard JSON data types, the following data types
+ are used in this specification:
+
+1.4.1. Id
+
+ Where "Id" is given as a data type, it means a "String" of at least 1
+ and a maximum of 255 octets in size, and it MUST only contain
+ characters from the "URL and Filename Safe" base64url alphabet, as
+ defined in Section 5 of [RFC4648], excluding the pad character ("=").
+ This means the allowed characters are the ASCII alphanumeric
+ characters ("A-Za-z0-9"), hyphen ("-"), and underscore ("_").
+
+ In many places in JSCalendar, a JSON map is used where the map keys
+ are of type Id and the map values are all the same type of object.
+ This construction represents an unordered set of objects, with the
+ added advantage that each entry has a name (the corresponding map
+ key). This allows for more concise patching of objects, and, when
+ applicable, for the objects in question to be referenced from other
+ objects within the JSCalendar object.
+
+ Unless otherwise specified for a particular property, there are no
+ uniqueness constraints on an Id value (other than, of course, the
+ requirement that you cannot have two values with the same key within
+ a single JSON map). For example, two Event objects might use the
+ same Ids in their respective "links" properties or, within the same
+ Event object, the same Id could appear in the "participants" and
+ "alerts" properties. These situations do not imply any semantic
+ connections among the objects.
+
+1.4.2. Int
+
+ Where "Int" is given as a data type, it means an integer in the range
+ -2^53+1 <= value <= 2^53-1, the safe range for integers stored in a
+ floating-point double, represented as a JSON "Number".
+
+1.4.3. UnsignedInt
+
+ Where "UnsignedInt" is given as a data type, it means an integer in
+ the range 0 <= value <= 2^53-1, represented as a JSON "Number".
+
+1.4.4. UTCDateTime
+
+ This is a string in the "date-time" [RFC3339] format, with the
+ further restrictions that any letters MUST be in uppercase, and the
+ time offset MUST be the character "Z". Fractional second values MUST
+ NOT be included unless non-zero and MUST NOT have trailing zeros, to
+ ensure there is only a single representation for each date-time.
+
+ For example, "2010-10-10T10:10:10.003Z" is conformant, but
+ "2010-10-10T10:10:10.000Z" is invalid and is correctly encoded as
+ "2010-10-10T10:10:10Z".
+
+1.4.5. LocalDateTime
+
+ This is a date-time string with no time zone/offset information. It
+ is otherwise in the same format as UTCDateTime, including fractional
+ seconds. For example, "2006-01-02T15:04:05" and
+ "2006-01-02T15:04:05.003" are both valid. The time zone to associate
+ with the LocalDateTime comes from the "timeZone" property of the
+ JSCalendar object (see Section 4.7.1). If no time zone is specified,
+ the LocalDateTime is "floating". Floating date-times are not tied to
+ any specific time zone. Instead, they occur in each time zone at the
+ given wall-clock time (as opposed to the same instant point in time).
+
+ A time zone may have a period of discontinuity, for example, a change
+ from standard time to daylight savings time. When converting local
+ date-times that fall in the discontinuity to UTC, the offset before
+ the transition MUST be used.
+
+ For example, in the America/Los_Angeles time zone, the date-time
+ 2020-11-01T01:30:00 occurs twice: before the daylight savings time
+ (DST) transition with a UTC offset of -07:00 and again after the
+ transition with an offset of -08:00. When converting to UTC, we
+ therefore use the offset before the transition (-07:00), so it
+ becomes 2020-11-01T08:30:00Z.
+
+ Similarly, in the Australia/Melbourne time zone, the date-time
+ 2020-10-04T02:30:00 does not exist; the clocks are moved forward one
+ hour for DST on that day at 02:00. However, such a value may appear
+ during calculations (see duration semantics in Section 1.4.6) or due
+ to a change in time zone rules (so it was valid when the event was
+ first created). Again, it is interpreted as though the offset before
+ the transition is in effect (+10:00); therefore, when converted to
+ UTC, we get 2020-10-03T16:30:00Z.
+
+1.4.6. Duration
+
+ Where Duration is given as a type, it means a length of time
+ represented by a subset of the ISO 8601 duration format, as specified
+ by the following ABNF [RFC5234]:
+
+ dur-secfrac = "." 1*DIGIT
+ dur-second = 1*DIGIT [dur-secfrac] "S"
+ dur-minute = 1*DIGIT "M" [dur-second]
+ dur-hour = 1*DIGIT "H" [dur-minute]
+ dur-time = "T" (dur-hour / dur-minute / dur-second)
+ dur-day = 1*DIGIT "D"
+ dur-week = 1*DIGIT "W"
+ dur-cal = (dur-week [dur-day] / dur-day)
+
+ duration = "P" (dur-cal [dur-time] / dur-time)
+
+ In addition, the duration MUST NOT include fractional second values
+ unless the fraction is non-zero. Fractional second values MUST NOT
+ have trailing zeros to ensure there is only a single representation
+ for each duration.
+
+ A duration specifies an abstract number of weeks, days, hours,
+ minutes, and/or seconds. A duration specified using weeks or days
+ does not always correspond to an exact multiple of 24 hours. The
+ number of hours/minutes/seconds may vary if it overlaps a period of
+ discontinuity in the event's time zone, for example, a change from
+ standard time to daylight savings time. Leap seconds MUST NOT be
+ considered when adding or subtracting a duration to/from a
+ LocalDateTime.
+
+ To add a duration to a LocalDateTime:
+
+ 1. Add any week or day components of the duration to the date. A
+ week is always the same as seven days.
+
+ 2. If a time zone applies to the LocalDateTime, convert it to a
+ UTCDateTime following the semantics in Section 1.4.5.
+
+ 3. Add any hour, minute, or second components of the duration (in
+ absolute time).
+
+ 4. Convert the resulting UTCDateTime back to a LocalDateTime in the
+ time zone that applies.
+
+ To subtract a duration from a LocalDateTime, the steps apply in
+ reverse:
+
+ 1. If a time zone applies to the LocalDateTime, convert it to UTC
+ following the semantics in Section 1.4.5.
+
+ 2. Subtract any hour, minute, or second components of the duration
+ (in absolute time).
+
+ 3. Convert the resulting UTCDateTime back to LocalDateTime in the
+ time zone that applies.
+
+ 4. Subtract any week or day components of the duration from the
+ date.
+
+ 5. If the resulting time does not exist on the date due to a
+ discontinuity in the time zone, use the semantics in
+ Section 1.4.5 to convert to UTC and back to get a valid
+ LocalDateTime.
+
+ These semantics match the iCalendar DURATION value type ([RFC5545],
+ Section 3.3.6).
+
+1.4.7. SignedDuration
+
+ A SignedDuration represents a length of time that may be positive or
+ negative and is typically used to express the offset of a point in
+ time relative to an associated time. It is represented as a
+ Duration, optionally preceded by a sign character. It is specified
+ by the following ABNF:
+
+ signed-duration = ["+" / "-"] duration
+
+ A negative sign indicates a point in time at or before the associated
+ time; a positive or no sign indicates a time at or after the
+ associated time.
+
+1.4.8. TimeZoneId
+
+ Where "TimeZoneId" is given as a data type, it means a "String" that
+ is either a time zone name in the IANA Time Zone Database [TZDB] or a
+ custom time zone identifier defined in the "timeZones" property (see
+ Section 4.7.2).
+
+ Where an IANA time zone is specified, the zone rules of the
+ respective zone records apply. Custom time zones are interpreted as
+ described in Section 4.7.2.
+
+1.4.9. PatchObject
+
+ A PatchObject is of type "String[*]" and represents an unordered set
+ of patches on a JSON object. Each key is a path represented in a
+ subset of the JSON Pointer format [RFC6901]. The paths have an
+ implicit leading "/", so each key is prefixed with "/" before
+ applying the JSON Pointer evaluation algorithm.
+
+ A patch within a PatchObject is only valid if all of the following
+ conditions apply:
+
+ 1. The pointer MUST NOT reference inside an array (i.e., you MUST
+ NOT insert/delete from an array; the array MUST be replaced in
+ its entirety instead).
+
+ 2. All parts prior to the last (i.e., the value after the final
+ slash) MUST already exist on the object being patched.
+
+ 3. There MUST NOT be two patches in the PatchObject where the
+ pointer of one is the prefix of the pointer of the other, e.g.,
+ "alerts/1/offset" and "alerts".
+
+ 4. The value for the patch MUST be valid for the property being set
+ (of the correct type and obeying any other applicable
+ restrictions), or, if null, the property MUST be optional.
+
+ The value associated with each pointer determines how to apply that
+ patch:
+
+ * If null, remove the property from the patched object. If the key
+ is not present in the parent, this a no-op.
+
+ * If non-null, set the value given as the value for this property
+ (this may be a replacement or addition to the object being
+ patched).
+
+ A PatchObject does not define its own "@type" property (see
+ Section 4.1.1). An "@type" property in a patch MUST be handled as
+ any other patched property value.
+
+ Implementations MUST reject a PatchObject in its entirety if any of
+ its patches are invalid. Implementations MUST NOT apply partial
+ patches.
+
+ The PatchObject format is used to significantly reduce file size and
+ duplicated content when specifying variations to a common object,
+ such as with recurring events or when translating the data into
+ multiple languages. It can also better preserve semantic intent if
+ only the properties that should differ between the two objects are
+ patched. For example, if one person is not going to a particular
+ instance of a regularly scheduled event, in iCalendar, you would have
+ to duplicate the entire event in the override. In JSCalendar, this
+ is a small patch to show the difference. As only this property is
+ patched, if the location of the event is changed, the occurrence will
+ automatically still inherit this.
+
+1.4.10. Relation
+
+ A Relation object defines the relation to other objects, using a
+ possibly empty set of relation types. The object that defines this
+ relation is the linking object, while the other object is the linked
+ object. A Relation object has the following properties:
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be "Relation".
+
+ relation: "String[Boolean]" (optional, default: empty Object)
+ This describes how the linked object is related to the linking
+ object. The relation is defined as a set of relation types. If
+ empty, the relationship between the two objects is unspecified.
+
+ Keys in the set MUST be one of the following values, specified in
+ the property definition where the Relation object is used, a value
+ registered in the IANA "JSCalendar Enum Values" registry, or a
+ vendor-specific value (see Section 3.3):
+
+ "first": The linked object is the first in a series the linking
+ object is part of.
+
+ "next": The linked object is next in a series the linking object
+ is part of.
+
+ "child": The linked object is a subpart of the linking object.
+
+ "parent": The linking object is a subpart of the linked object.
+
+ The value for each key in the map MUST be true.
+
+1.4.11. Link
+
+ A Link object represents an external resource associated with the
+ linking object. It has the following properties:
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be "Link".
+
+ href: "String" (mandatory)
+ This is a URI [RFC3986] from which the resource may be fetched.
+
+ This MAY be a "data:" URL [RFC2397], but it is recommended that
+ the file be hosted on a server to avoid embedding arbitrarily
+ large data in JSCalendar object instances.
+
+ cid: "String" (optional)
+ This MUST be a valid "content-id" value according to the
+ definition of Section 2 of [RFC2392]. The value MUST be unique
+ within this Link object but has no meaning beyond that. It MAY be
+ different from the link id for this Link object.
+
+ contentType: "String" (optional)
+ This is the media type [RFC6838] of the resource, if known.
+
+ size: "UnsignedInt" (optional)
+ This is the size, in octets, of the resource when fully decoded
+ (i.e., the number of octets in the file the user would download),
+ if known. Note that this is an informational estimate, and
+ implementations must be prepared to handle the actual size being
+ quite different when the resource is fetched.
+
+ rel: "String" (optional)
+ This identifies the relation of the linked resource to the object.
+ If set, the value MUST be a relation type from the IANA "Link
+ Relations" registry [LINKRELS], as established in [RFC8288].
+
+ display: "String" (optional)
+ This describes the intended purpose of a link to an image. If
+ set, the "rel" property MUST be set to "icon". The value MUST be
+ one of the following values, another value registered in the IANA
+ "JSCalendar Enum Values" registry, or a vendor-specific value (see
+ Section 3.3):
+
+ "badge": an image meant to be displayed alongside the title of
+ the object
+
+ "graphic": a full image replacement for the object itself
+
+ "fullsize": an image that is used to enhance the object
+
+ "thumbnail": a smaller variant of "fullsize" to be used when
+ space for the image is constrained
+
+ title: "String" (optional)
+ This is a human-readable, plain-text description of the resource.
+
+2. JSCalendar Objects
+
+ This section describes the calendar object types specified by
+ JSCalendar.
+
+2.1. Event
+
+ Media type: "application/jscalendar+json;type=event"
+
+ An Event represents a scheduled amount of time on a calendar,
+ typically a meeting, appointment, reminder, or anniversary. It is
+ required to start at a certain point in time and typically has a non-
+ zero duration. Multiple participants may partake in the event at
+ multiple locations.
+
+ The @type (Section 4.1.1) property value MUST be "Event".
+
+2.2. Task
+
+ Media type: "application/jscalendar+json;type=task"
+
+ A Task represents an action item, assignment, to-do item, or work
+ item. It may start and be due at certain points in time, take some
+ estimated time to complete, and recur, none of which is required.
+
+ The @type (Section 4.1.1) property value MUST be "Task".
+
+2.3. Group
+
+ Media type: "application/jscalendar+json;type=group"
+
+ A Group is a collection of Event (Section 2.1) and/or Task
+ (Section 2.2) objects. Typically, objects are grouped by topic
+ (e.g., by keywords) or calendar membership.
+
+ The @type (Section 4.1.1) property value MUST be "Group".
+
+3. Structure of JSCalendar Objects
+
+ A JSCalendar object is a JSON object [RFC8259], which MUST be valid
+ I-JSON (a stricter subset of JSON) [RFC7493]. Property names and
+ values are case sensitive.
+
+ The object has a collection of properties, as specified in the
+ following sections. Properties are specified as being either
+ mandatory or optional. Optional properties may have a default value
+ if explicitly specified in the property definition.
+
+3.1. Object Type
+
+ JSCalendar objects MUST name their type in the "@type" property if
+ not explicitly specified otherwise for the respective object type. A
+ notable exception to this rule is the PatchObject (Section 1.4.9).
+
+3.2. Normalization and Equivalence
+
+ JSCalendar aims to provide unambiguous definitions for value types
+ and properties but does not define a general normalization or
+ equivalence method for JSCalendar objects and types. This is because
+ the notion of equivalence might range from byte-level equivalence to
+ semantic equivalence, depending on the respective use case.
+ Normalization of JSCalendar objects is hindered because of the
+ following reasons:
+
+ * Custom JSCalendar properties may contain arbitrary JSON values,
+ including arrays. However, equivalence of arrays might or might
+ not depend on the order of elements, depending on the respective
+ property definition.
+
+ * Several JSCalendar property values are defined as URIs and media
+ types, but normalization of these types is inherently protocol and
+ scheme specific, depending on the use case of the equivalence
+ definition (see Section 6 of [RFC3986]).
+
+ Considering this, the definition of equivalence and normalization is
+ left to client and server implementations and to be negotiated by a
+ calendar exchange protocol or defined elsewhere.
+
+3.3. Vendor-Specific Property Extensions, Values, and Types
+
+ Vendors MAY add additional properties to the calendar object to
+ support their custom features. To avoid conflict, the names of these
+ properties MUST be prefixed by a domain name controlled by the vendor
+ followed by a colon, e.g., "example.com:customprop". If the value is
+ a new JSCalendar object, it either MUST include an "@type" property,
+ or it MUST explicitly be specified to not require a type designator.
+ The type name MUST be prefixed with a domain name controlled by the
+ vendor.
+
+ Some JSCalendar properties allow vendor-specific value extensions.
+ Such vendor-specific values MUST be prefixed by a domain name
+ controlled by the vendor followed by a colon, e.g.,
+ "example.com:customrel".
+
+ Vendors are strongly encouraged to register any new property values
+ or extensions that are useful to other systems as well, rather than
+ use a vendor-specific prefix.
+
+4. Common JSCalendar Properties
+
+ This section describes the properties that are common to the various
+ JSCalendar object types. Specific JSCalendar object types may only
+ support a subset of these properties. The object type definitions in
+ Section 5 describe the set of supported properties per type.
+
+4.1. Metadata Properties
+
+4.1.1. @type
+
+ Type: "String" (mandatory)
+
+ This specifies the type that this object represents. The allowed
+ value differs by object type and is defined in Sections 2.1, 2.2, and
+ 2.3.
+
+4.1.2. uid
+
+ Type: "String" (mandatory)
+
+ This is a globally unique identifier used to associate objects
+ representing the same event, task, group, or other object across
+ different systems, calendars, and views. For recurring events and
+ tasks, the UID is associated with the base object and therefore is
+ the same for all occurrences; the combination of the UID with a
+ "recurrenceId" identifies a particular instance.
+
+ The generator of the identifier MUST guarantee that the identifier is
+ unique. [RFC4122] describes a range of established algorithms to
+ generate universally unique identifiers (UUIDs). UUID version 4,
+ described in Section 4.4 of [RFC4122], is RECOMMENDED.
+
+ For compatibility with UIDs [RFC5545], implementations MUST be able
+ to receive and persist values of at least 255 octets for this
+ property, but they MUST NOT truncate values in the middle of a UTF-8
+ multi-octet sequence.
+
+4.1.3. relatedTo
+
+ Type: "String[Relation]" (optional)
+
+ This relates the object to other JSCalendar objects. This is
+ represented as a map of the UIDs of the related objects to
+ information about the relation.
+
+ If an object is split to make a "this and future" change to a
+ recurrence, the original object MUST be truncated to end at the
+ previous occurrence before this split, and a new object is created to
+ represent all the occurrences after the split. A "next" relation
+ MUST be set on the original object's "relatedTo" property for the UID
+ of the new object. A "first" relation for the UID of the first
+ object in the series MUST be set on the new object. Clients can then
+ follow these UIDs to get the complete set of objects if the user
+ wishes to modify them all at once.
+
+4.1.4. prodId
+
+ Type: "String" (optional)
+
+ This is the identifier for the product that last updated the
+ JSCalendar object. This should be set whenever the data in the
+ object is modified (i.e., whenever the "updated" property is set).
+
+ The vendor of the implementation MUST ensure that this is a globally
+ unique identifier, using some technique such as a Formal Public
+ Identifier (FPI) value, as defined in [ISO.9070.1991].
+
+ This property SHOULD NOT be used to alter the interpretation of a
+ JSCalendar object beyond the semantics specified in this document.
+ For example, it is not to be used to further the understanding of
+ nonstandard properties, a practice that is known to cause long-term
+ interoperability problems.
+
+4.1.5. created
+
+ Type: "UTCDateTime" (optional)
+
+ This is the date and time this object was initially created.
+
+4.1.6. updated
+
+ Type: "UTCDateTime" (mandatory)
+
+ This is the date and time the data in this object was last modified
+ (or its creation date/time if not modified since).
+
+4.1.7. sequence
+
+ Type: "UnsignedInt" (optional, default: 0)
+
+ Initially zero, this MUST be incremented by one every time a change
+ is made to the object, except if the change only modifies the
+ "participants" property (see Section 4.4.6).
+
+ This is used as part of the iCalendar Transport-independent
+ Interoperability Protocol (iTIP) [RFC5546] to know which version of
+ the object a scheduling message relates to.
+
+4.1.8. method
+
+ Type: "String" (optional)
+
+ This is the iTIP [RFC5546] method, in lowercase. This MUST only be
+ present if the JSCalendar object represents an iTIP scheduling
+ message.
+
+4.2. What and Where Properties
+
+4.2.1. title
+
+ Type: "String" (optional, default: empty String)
+
+ This is a short summary of the object.
+
+4.2.2. description
+
+ Type: "String" (optional, default: empty String)
+
+ This is a longer-form text description of the object. The content is
+ formatted according to the "descriptionContentType" property.
+
+4.2.3. descriptionContentType
+
+ Type: "String" (optional, default: "text/plain")
+
+ This describes the media type [RFC6838] of the contents of the
+ "description" property. Media types MUST be subtypes of type "text"
+ and SHOULD be "text/plain" or "text/html" [MEDIATYPES]. They MAY
+ include parameters, and the "charset" parameter value MUST be "utf-
+ 8", if specified. Descriptions of type "text/html" MAY contain "cid"
+ URLs [RFC2392] to reference links in the calendar object by use of
+ the "cid" property of the Link object.
+
+4.2.4. showWithoutTime
+
+ Type: "Boolean" (optional, default: false)
+
+ This indicates that the time is not important to display to the user
+ when rendering this calendar object. An example of this is an event
+ that conceptually occurs all day or across multiple days, such as
+ "New Year's Day" or "Italy Vacation". While the time component is
+ important for free-busy calculations and checking for scheduling
+ clashes, calendars may choose to omit displaying it and/or display
+ the object separately to other objects to enhance the user's view of
+ their schedule.
+
+ Such events are also commonly known as "all-day" events.
+
+4.2.5. locations
+
+ Type: "Id[Location]" (optional)
+
+ This is a map of location ids to Location objects, representing
+ locations associated with the object.
+
+ A Location object has the following properties. It MUST have at
+ least one property other than the "relativeTo" property.
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be "Location".
+
+ name: "String" (optional)
+ This is the human-readable name of the location.
+
+ description: "String" (optional)
+ This is the human-readable, plain-text instructions for accessing
+ this location. This may be an address, set of directions, door
+ access code, etc.
+
+ locationTypes: "String[Boolean]" (optional)
+ This is a set of one or more location types that describe this
+ location. All types MUST be from the "Location Types Registry"
+ [LOCATIONTYPES], as defined in [RFC4589]. The set is represented
+ as a map, with the keys being the location types. The value for
+ each key in the map MUST be true.
+
+ relativeTo: "String" (optional)
+ This specifies the relation between this location and the time of
+ the JSCalendar object. This is primarily to allow events
+ representing travel to specify the location of departure (at the
+ start of the event) and location of arrival (at the end); this is
+ particularly important if these locations are in different time
+ zones, as a client may wish to highlight this information for the
+ user.
+
+ This MUST be one of the following values, another value registered
+ in the IANA "JSCalendar Enum Values" registry, or a vendor-
+ specific value (see Section 3.3). Any value the client or server
+ doesn't understand should be treated the same as if this property
+ is omitted.
+
+ "start": The event/task described by this JSCalendar object
+ occurs at this location at the time the event/task starts.
+
+ "end": The event/task described by this JSCalendar object occurs
+ at this location at the time the event/task ends.
+
+ timeZone: "TimeZoneId" (optional)
+ This is a time zone for this location.
+
+ coordinates: "String" (optional)
+ This is a "geo:" URI [RFC5870] for the location.
+
+ links: "Id[Link]" (optional)
+ This is a map of link ids to Link objects, representing external
+ resources associated with this location, for example, a vCard or
+ image. If there are no links, this MUST be omitted (rather than
+ specified as an empty set).
+
+4.2.6. virtualLocations
+
+ Type: "Id[VirtualLocation]" (optional)
+
+ This is a map of virtual location ids to VirtualLocation objects,
+ representing virtual locations, such as video conferences or chat
+ rooms, associated with the object.
+
+ A VirtualLocation object has the following properties.
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be
+ "VirtualLocation".
+
+ name: "String" (optional, default: empty String)
+ This is the human-readable name of the virtual location.
+
+ description: "String" (optional)
+ These are human-readable plain-text instructions for accessing
+ this virtual location. This may be a conference access code, etc.
+
+ uri: "String" (mandatory)
+ This is a URI [RFC3986] that represents how to connect to this
+ virtual location.
+
+ This may be a telephone number (represented using the "tel:"
+ scheme, e.g., "tel:+1-555-555-5555") for a teleconference, a web
+ address for online chat, or any custom URI.
+
+ features: "String[Boolean]" (optional)
+ A set of features supported by this virtual location. The set is
+ represented as a map, with the keys being the feature. The value
+ for each key in the map MUST be true.
+
+ The feature MUST be one of the following values, another value
+ registered in the IANA "JSCalendar Enum Values" registry, or a
+ vendor-specific value (see Section 3.3). Any value the client or
+ server doesn't understand should be treated the same as if this
+ feature is omitted.
+
+ audio: Audio conferencing
+
+ chat: Chat or instant messaging
+
+ feed: Blog or atom feed
+
+ moderator: Provides moderator-specific features
+
+ phone: Phone conferencing
+
+ screen: Screen sharing
+
+ video: Video conferencing
+
+4.2.7. links
+
+ Type: "Id[Link]" (optional)
+
+ This is a map of link ids to Link objects, representing external
+ resources associated with the object.
+
+ Links with a rel of "enclosure" MUST be considered by the client to
+ be attachments for download.
+
+ Links with a rel of "describedby" MUST be considered by the client to
+ be alternative representations of the description.
+
+ Links with a rel of "icon" MUST be considered by the client to be
+ images that it may use when presenting the calendar data to a user.
+ The "display" property may be set to indicate the purpose of this
+ image.
+
+4.2.8. locale
+
+ Type: "String" (optional)
+
+ This is the language tag, as defined in [RFC5646], that best
+ describes the locale used for the text in the calendar object, if
+ known.
+
+4.2.9. keywords
+
+ Type: "String[Boolean]" (optional)
+
+ This is a set of keywords or tags that relate to the object. The set
+ is represented as a map, with the keys being the keywords. The value
+ for each key in the map MUST be true.
+
+4.2.10. categories
+
+ Type: "String[Boolean]" (optional)
+
+ This is a set of categories that relate to the calendar object. The
+ set is represented as a map, with the keys being the categories
+ specified as URIs. The value for each key in the map MUST be true.
+
+ In contrast to keywords, categories are typically structured. For
+ example, a vendor owning the domain "example.com" might define the
+ categories "http://example.com/categories/sports/american-football"
+ and "http://example.com/categories/music/r-b".
+
+4.2.11. color
+
+ Type: "String" (optional)
+
+ This is a color clients MAY use when displaying this calendar object.
+ The value is a color name taken from the set of names defined in
+ Section 4.3 of CSS Color Module Level 3 [COLORS] or an RGB value in
+ hexadecimal notation, as defined in Section 4.2.1 of CSS Color Module
+ Level 3.
+
+4.3. Recurrence Properties
+
+ Some events and tasks occur at regular or irregular intervals.
+ Rather than having to copy the data for every occurrence, there can
+ be a base event with rules to generate recurrences and/or overrides
+ that add extra dates or exceptions to the rules.
+
+ The recurrence set is the complete set of instances for an object.
+ It is generated by considering the following properties in order, all
+ of which are optional:
+
+ 1. The "recurrenceRules" property (Section 4.3.3) generates a set of
+ extra date-times on which the object occurs.
+
+ 2. The "excludedRecurrenceRules" property (Section 4.3.4) generates
+ a set of date-times that are to be removed from the previously
+ generated set of date-times on which the object occurs.
+
+ 3. The "recurrenceOverrides" property (Section 4.3.5) defines date-
+ times that are added or excluded to form the final set. (This
+ property may also contain changes to the object to apply to
+ particular instances.)
+
+4.3.1. recurrenceId
+
+ Type: "LocalDateTime" (optional)
+
+ If present, this JSCalendar object represents one occurrence of a
+ recurring JSCalendar object. If present, the "recurrenceRules" and
+ "recurrenceOverrides" properties MUST NOT be present.
+
+ The value is a date-time either produced by the "recurrenceRules" of
+ the base event or added as a key to the "recurrenceOverrides"
+ property of the base event.
+
+4.3.2. recurrenceIdTimeZone
+
+ Type: "TimeZoneId|null" (optional, default: null)
+
+ Identifies the time zone of the main JSCalendar object, of which this
+ JSCalendar object is a recurrence instance. This property MUST be
+ set if the "recurrenceId" property is set. It MUST NOT be set if the
+ "recurrenceId" property is not set.
+
+4.3.3. recurrenceRules
+
+ Type: "RecurrenceRule[]" (optional)
+
+ This defines a set of recurrence rules (repeating patterns) for
+ recurring calendar objects.
+
+ An Event recurs by applying the recurrence rules to the "start" date-
+ time.
+
+ A Task recurs by applying the recurrence rules to the "start" date-
+ time, if defined; otherwise, it recurs by the "due" date-time, if
+ defined. If the task defines neither a "start" nor "due" date-time,
+ it MUST NOT define a "recurrenceRules" property.
+
+ If multiple recurrence rules are given, each rule is to be applied,
+ and then the union of the results are used, ignoring any duplicates.
+
+ A RecurrenceRule object is a JSON object mapping of a RECUR value
+ type in iCalendar [RFC5545] [RFC7529] and has the same semantics. It
+ has the following properties:
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be
+ "RecurrenceRule".
+
+ frequency: "String" (mandatory)
+ This is the time span covered by each iteration of this recurrence
+ rule (see Section 4.3.3.1 for full semantics). This MUST be one
+ of the following values:
+
+ * "yearly"
+
+ * "monthly"
+
+ * "weekly"
+
+ * "daily"
+
+ * "hourly"
+
+ * "minutely"
+
+ * "secondly"
+
+ This is the FREQ part from iCalendar, converted to lowercase.
+
+ interval: "UnsignedInt" (optional, default: 1)
+ This is the interval of iteration periods at which the recurrence
+ repeats. If included, it MUST be an integer >= 1.
+
+ This is the INTERVAL part from iCalendar.
+
+ rscale: "String" (optional, default: "gregorian")
+ This is the calendar system in which this recurrence rule
+ operates, in lowercase. This MUST be either a CLDR-registered
+ calendar system name [CLDR] or a vendor-specific value (see
+ Section 3.3).
+
+ This is the RSCALE part from iCalendar RSCALE [RFC7529], converted
+ to lowercase.
+
+ skip: "String" (optional, default: "omit")
+ This is the behavior to use when the expansion of the recurrence
+ produces invalid dates. This property only has an effect if the
+ frequency is "yearly" or "monthly". It MUST be one of the
+ following values:
+
+ * "omit"
+
+ * "backward"
+
+ * "forward"
+
+ This is the SKIP part from iCalendar RSCALE [RFC7529], converted
+ to lowercase.
+
+ firstDayOfWeek: "String" (optional, default: "mo")
+ This is the day on which the week is considered to start,
+ represented as a lowercase, abbreviated, and two-letter English
+ day of the week. If included, it MUST be one of the following
+ values:
+
+ * "mo"
+
+ * "tu"
+
+ * "we"
+
+ * "th"
+
+ * "fr"
+
+ * "sa"
+
+ * "su"
+
+ This is the WKST part from iCalendar.
+
+ byDay: "NDay[]" (optional)
+ These are days of the week on which to repeat. An "NDay" object
+ has the following properties:
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be "NDay".
+
+ day: "String" (mandatory)
+ This is a day of the week on which to repeat; the allowed
+ values are the same as for the "firstDayOfWeek" recurrenceRule
+ property.
+
+ This is the day of the week of the BYDAY part in iCalendar,
+ converted to lowercase.
+
+ nthOfPeriod: "Int" (optional)
+ If present, rather than representing every occurrence of the
+ weekday defined in the "day" property, it represents only a
+ specific instance within the recurrence period. The value can
+ be positive or negative but MUST NOT be zero. A negative
+ integer means the nth-last occurrence within that period (i.e.,
+ -1 is the last occurrence, -2 the one before that, etc.).
+
+ This is the ordinal part of the BYDAY value in iCalendar (e.g.,
+ 1 or -3).
+
+ byMonthDay: "Int[]" (optional)
+ These are the days of the month on which to repeat. Valid values
+ are between 1 and the maximum number of days any month may have in
+ the calendar given by the "rscale" property and the negative
+ values of these numbers. For example, in the Gregorian calendar,
+ valid values are 1 to 31 and -31 to -1. Negative values offset
+ from the end of the month. The array MUST have at least one entry
+ if included.
+
+ This is the BYMONTHDAY part in iCalendar.
+
+ byMonth: "String[]" (optional)
+ These are the months in which to repeat. Each entry is a string
+ representation of a number, starting from "1" for the first month
+ in the calendar (e.g., "1" means January with the Gregorian
+ calendar), with an optional "L" suffix (see [RFC7529]) for leap
+ months (this MUST be uppercase, e.g., "3L"). The array MUST have
+ at least one entry if included.
+
+ This is the BYMONTH part from iCalendar.
+
+ byYearDay: "Int[]" (optional)
+ These are the days of the year on which to repeat. Valid values
+ are between 1 and the maximum number of days any year may have in
+ the calendar given by the "rscale" property and the negative
+ values of these numbers. For example, in the Gregorian calendar,
+ valid values are 1 to 366 and -366 to -1. Negative values offset
+ from the end of the year. The array MUST have at least one entry
+ if included.
+
+ This is the BYYEARDAY part from iCalendar.
+
+ byWeekNo: "Int[]" (optional)
+ These are the weeks of the year in which to repeat. Valid values
+ are between 1 and the maximum number of weeks any year may have in
+ the calendar given by the "rscale" property and the negative
+ values of these numbers. For example, in the Gregorian calendar,
+ valid values are 1 to 53 and -53 to -1. The array MUST have at
+ least one entry if included.
+
+ This is the BYWEEKNO part from iCalendar.
+
+ byHour: "UnsignedInt[]" (optional)
+ These are the hours of the day in which to repeat. Valid values
+ are 0 to 23. The array MUST have at least one entry if included.
+ This is the BYHOUR part from iCalendar.
+
+ byMinute: "UnsignedInt[]" (optional)
+ These are the minutes of the hour in which to repeat. Valid
+ values are 0 to 59. The array MUST have at least one entry if
+ included.
+
+ This is the BYMINUTE part from iCalendar.
+
+ bySecond: "UnsignedInt[]" (optional)
+ These are the seconds of the minute in which to repeat. Valid
+ values are 0 to 60. The array MUST have at least one entry if
+ included.
+
+ This is the BYSECOND part from iCalendar.
+
+ bySetPosition: "Int[]" (optional)
+ These are the occurrences within the recurrence interval to
+ include in the final results. Negative values offset from the end
+ of the list of occurrences. The array MUST have at least one
+ entry if included. This is the BYSETPOS part from iCalendar.
+
+ count: "UnsignedInt" (optional)
+ These are the number of occurrences at which to range-bound the
+ recurrence. This MUST NOT be included if an "until" property is
+ specified.
+
+ This is the COUNT part from iCalendar.
+
+ until: "LocalDateTime" (optional)
+ These are the date-time at which to finish recurring. The last
+ occurrence is on or before this date-time. This MUST NOT be
+ included if a "count" property is specified. Note that if not
+ specified otherwise for a specific JSCalendar object, this date is
+ to be interpreted in the time zone specified in the JSCalendar
+ object's "timeZone" property.
+
+ This is the UNTIL part from iCalendar.
+
+4.3.3.1. Interpreting Recurrence Rules
+
+ A recurrence rule specifies a set of date-times for recurring
+ calendar objects. A recurrence rule has the following semantics.
+ Note that wherever "year", "month", or "day of month" is used, this
+ is within the calendar system given by the "rscale" property, which
+ defaults to "gregorian" if omitted.
+
+ 1. A set of candidates is generated. This is every second within a
+ period defined by the "frequency" property value:
+
+ "yearly": every second from midnight on the first day of a year
+ (inclusive) to midnight the first day of the following year
+ (exclusive).
+
+ If skip is not "omit", the calendar system has leap months,
+ and there is a "byMonth" property, generate candidates for the
+ leap months, even if they don't occur in this year.
+
+ If skip is not "omit" and there is a "byMonthDay" property,
+ presume each month has the maximum number of days any month
+ may have in this calendar system when generating candidates,
+ even if it's more than this month actually has.
+
+ "monthly": every second from midnight on the first day of a
+ month (inclusive) to midnight on the first of the following
+ month (exclusive).
+
+ If skip is not "omit" and there is a "byMonthDay" property,
+ presume the month has the maximum number of days any month may
+ have in this calendar system when generating candidates, even
+ if it's more than this month actually has.
+
+ "weekly": every second from midnight (inclusive) on the first
+ day of the week (as defined by the "firstDayOfWeek" property
+ or Monday if omitted) to midnight seven days later
+ (exclusive).
+
+ "daily": every second from midnight at the start of the day
+ (inclusive) to midnight at the end of the day (exclusive).
+
+ "hourly": every second from the beginning of the hour
+ (inclusive) to the beginning of the next hour (exclusive).
+
+ "minutely": every second from the beginning of the minute
+ (inclusive) to the beginning of the next minute (exclusive).
+
+ "secondly": only the second itself.
+
+ 2. Each date-time candidate is compared against all of the byX
+ properties of the rule except bySetPosition. If any property in
+ the rule does not match the date-time, the date-time is
+ eliminated. Each byX property is an array; the date-time matches
+ the property if it matches any of the values in the array. The
+ properties have the following semantics:
+
+ byMonth: The date-time is in the given month.
+
+ byWeekNo: The date-time is in the nth week of the year.
+ Negative numbers mean the nth last week of the year. This
+ corresponds to weeks according to week numbering, as defined
+ in ISO.8601.2004, with a week defined as a seven-day period,
+ starting on the "firstDayOfWeek" property value or Monday if
+ omitted. Week number one of the calendar year is the first
+ week that contains at least four days in that calendar year.
+
+ If the date-time is not valid (this may happen when generating
+ candidates with a "skip" property in effect), it is always
+ eliminated by this property.
+
+ byYearDay: The date-time is on the nth day of year. Negative
+ numbers mean the nth last day of the year.
+
+ If the date-time is not valid (this may happen when generating
+ candidates with a "skip" property in effect), it is always
+ eliminated by this property.
+
+ byMonthDay: The date-time is on the given day of the month.
+ Negative numbers mean the nth last day of the month.
+
+ byDay: The date-time is on the given day of the week. If the
+ day is prefixed by a number, it is the nth occurrence of that
+ day of the week within the month (if frequency is monthly) or
+ year (if frequency is yearly). Negative numbers mean the nth
+ last occurrence within that period.
+
+ byHour: The date-time has the given hour value.
+
+ byMinute: The date-time has the given minute value.
+
+ bySecond: The date-time has the given second value.
+
+ If a "skip" property is defined and is not "omit", there may be
+ candidates that do not correspond to valid dates (e.g., February
+ 31st in the Gregorian calendar). In this case, the properties
+ MUST be considered in the order above, and:
+
+ 1. After applying the byMonth filter, if the candidate's month
+ is invalid for the given year, increment it (if skip is
+ "forward") or decrement it (if skip is "backward") until a
+ valid month is found, incrementing/decrementing the year as
+ well if passing through the beginning/end of the year. This
+ only applies to calendar systems with leap months.
+
+ 2. After applying the byMonthDay filter, if the day of the month
+ is invalid for the given month and year, change the date to
+ the first day of the next month (if skip is "forward") or the
+ last day of the current month (if skip is "backward").
+
+ 3. If any valid date produced after applying the skip is already
+ a candidate, eliminate the duplicate. (For example, after
+ adjusting, February 30th and February 31st would both become
+ the same "real" date, so one is eliminated as a duplicate.)
+
+ 3. If a "bySetPosition" property is included, this is now applied to
+ the ordered list of remaining dates. This property specifies the
+ indexes of date-times to keep; all others should be eliminated.
+ Negative numbers are indexed from the end of the list, with -1
+ being the last item, -2 the second from last, etc.
+
+ 4. Any date-times before the start date of the event are eliminated
+ (see below for why this might be needed).
+
+ 5. If a "skip" property is included and is not "omit", eliminate any
+ date-times that have already been produced by previous iterations
+ of the algorithm. (This is not possible if skip is "omit".)
+
+ 6. If further dates are required (we have not reached the until date
+ or count limit), skip the next (interval - 1) sets of candidates,
+ then continue from step 1.
+
+ When determining the set of occurrence dates for an event or task,
+ the following extra rules must be applied:
+
+ 1. The initial date-time to which the rule is applied (the "start"
+ date-time for events or the "start" or "due" date-time for tasks)
+ is always the first occurrence in the expansion (and is counted
+ if the recurrence is limited by a "count" property), even if it
+ would normally not match the rule.
+
+ 2. The first set of candidates to consider is that which would
+ contain the initial date-time. This means the first set may
+ include candidates before the initial date-time; such candidates
+ are eliminated from the results in step 4 of the list above.
+
+ 3. The following properties MUST be implicitly added to the rule
+ under the given conditions:
+
+ * If frequency is not "secondly" and there is no "bySecond"
+ property, add a "bySecond" property with the sole value being
+ the seconds value of the initial date-time.
+
+ * If frequency is not "secondly" or "minutely" and there is no
+ "byMinute" property, add a "byMinute" property with the sole
+ value being the minutes value of the initial date-time.
+
+ * If frequency is not "secondly", "minutely", or "hourly" and
+ there is no "byHour" property, add a "byHour" property with
+ the sole value being the hours value of the initial date-time.
+
+ * If frequency is "weekly" and there is no "byDay" property, add
+ a "byDay" property with the sole value being the day of the
+ week of the initial date-time.
+
+ * If frequency is "monthly" and there is no "byDay" property and
+ no "byMonthDay" property, add a "byMonthDay" property with the
+ sole value being the day of the month of the initial date-
+ time.
+
+ * If frequency is "yearly" and there is no "byYearDay" property:
+
+ - If there are no "byMonth" or "byWeekNo" properties, and
+ either there is a "byMonthDay" property or there is no
+ "byDay" property, add a "byMonth" property with the sole
+ value being the month of the initial date-time.
+
+ - If there are no "byMonthDay", "byWeekNo", or "byDay"
+ properties, add a "byMonthDay" property with the sole value
+ being the day of the month of the initial date-time.
+
+ - If there is a "byWeekNo" property and no "byMonthDay" or
+ "byDay" properties, add a "byDay" property with the sole
+ value being the day of the week of the initial date-time.
+
+4.3.4. excludedRecurrenceRules
+
+ Type: "RecurrenceRule[]" (optional)
+
+ This defines a set of recurrence rules (repeating patterns) for date-
+ times on which the object will not occur. The rules are interpreted
+ the same as for the "recurrenceRules" property (see Section 4.3.3),
+ with the exception that the initial date-time to which the rule is
+ applied (the "start" date-time for events or the "start" or "due"
+ date-time for tasks) is only considered part of the expansion if it
+ matches the rule. The resulting set of date-times is then removed
+ from those generated by the "recurrenceRules" property, as described
+ in Section 4.3.
+
+4.3.5. recurrenceOverrides
+
+ Type: "LocalDateTime[PatchObject]" (optional)
+
+ Maps recurrence ids (the date-time produced by the recurrence rule)
+ to the overridden properties of the recurrence instance.
+
+ If the recurrence id does not match a date-time from the recurrence
+ rule (or no rule is specified), it is to be treated as an additional
+ occurrence (like an RDATE from iCalendar). The patch object may
+ often be empty in this case.
+
+ If the patch object defines the "excluded" property of an occurrence
+ to be true, this occurrence is omitted from the final set of
+ recurrences for the calendar object (like an EXDATE from iCalendar).
+ Such a patch object MUST NOT patch any other property.
+
+ By default, an occurrence inherits all properties from the main
+ object except the start (or due) date-time, which is shifted to match
+ the recurrence id LocalDateTime. However, individual properties of
+ the occurrence can be modified by a patch or multiple patches. It is
+ valid to patch the "start" property value, and this patch takes
+ precedence over the value generated from the recurrence id. Both the
+ recurrence id as well as the patched "start" date-time may occur
+ before the original JSCalendar object's "start" or "due" date.
+
+ A pointer in the PatchObject MUST be ignored if it starts with one of
+ the following prefixes:
+
+ * @type
+
+ * excludedRecurrenceRules
+
+ * method
+
+ * privacy
+
+ * prodId
+
+ * recurrenceId
+
+ * recurrenceIdTimeZone
+
+ * recurrenceOverrides
+
+ * recurrenceRules
+
+ * relatedTo
+
+ * replyTo
+
+ * sentBy
+
+ * timeZones
+
+ * uid
+
+4.3.6. excluded
+
+ Type: "Boolean" (optional, default: false)
+
+ This defines if this object is an overridden, excluded instance of a
+ recurring JSCalendar object (see Section 4.3.5). If this property
+ value is true, this calendar object instance MUST be removed from the
+ occurrence expansion. The absence of this property, or the presence
+ of its default value as false, indicates that this instance MUST be
+ included in the occurrence expansion.
+
+4.4. Sharing and Scheduling Properties
+
+4.4.1. priority
+
+ Type: "Int" (optional, default: 0)
+
+ This specifies a priority for the calendar object. This may be used
+ as part of scheduling systems to help resolve conflicts for a time
+ period.
+
+ The priority is specified as an integer in the range 0 to 9. A value
+ of 0 specifies an undefined priority, for which the treatment will
+ vary by situation. A value of 1 is the highest priority. A value of
+ 2 is the second highest priority. Subsequent numbers specify a
+ decreasing ordinal priority. A value of 9 is the lowest priority.
+ Other integer values are reserved for future use.
+
+4.4.2. freeBusyStatus
+
+ Type: "String" (optional, default: "busy")
+
+ This specifies how this calendar object should be treated when
+ calculating free-busy state. This MUST be one of the following
+ values, another value registered in the IANA "JSCalendar Enum Values"
+ registry, or a vendor-specific value (see Section 3.3):
+
+ "free": The object should be ignored when calculating whether the
+ user is busy.
+
+ "busy": The object should be included when calculating whether the
+ user is busy.
+
+4.4.3. privacy
+
+ Type: "String" (optional, default: "public")
+
+ Calendar objects are normally collected together and may be shared
+ with other users. The privacy property allows the object owner to
+ indicate that it should not be shared or should only have the time
+ information shared but the details withheld. Enforcement of the
+ restrictions indicated by this property is up to the API via which
+ this object is accessed.
+
+ This property MUST NOT affect the information sent to scheduled
+ participants; it is only interpreted by protocols that share the
+ calendar objects belonging to one user with other users.
+
+ The value MUST be one of the following values, another value
+ registered in the IANA "JSCalendar Enum Values" registry, or a
+ vendor-specific value (see Section 3.3). Any value the client or
+ server doesn't understand should be preserved but treated as
+ equivalent to "private".
+
+ "public": The full details of the object are visible to those whom
+ the object's calendar is shared with.
+
+ "private": The details of the object are hidden; only the basic time
+ and metadata are shared. The following properties MAY be shared;
+ any other properties MUST NOT be shared:
+
+ * @type
+
+ * created
+
+ * due
+
+ * duration
+
+ * estimatedDuration
+
+ * freeBusyStatus
+
+ * privacy
+
+ * recurrenceOverrides (Only patches that apply to another
+ permissible property are allowed to be shared.)
+
+ * sequence
+
+ * showWithoutTime
+
+ * start
+
+ * timeZone
+
+ * timeZones
+
+ * uid
+
+ * updated
+
+ "secret": The object is hidden completely (as though it did not
+ exist) when the calendar this object is in is shared.
+
+4.4.4. replyTo
+
+ Type: "String[String]" (optional)
+
+ This represents methods by which participants may submit their
+ response to the organizer of the calendar object. The keys in the
+ property value are the available methods and MUST only contain ASCII
+ alphanumeric characters (A-Za-z0-9). The value is a URI for the
+ method specified in the key. Future methods may be defined in future
+ specifications and registered with IANA; a calendar client MUST
+ ignore any method it does not understand but MUST preserve the method
+ key and URI. This property MUST be omitted if no method is defined
+ (rather than being specified as an empty object).
+
+ The following methods are defined:
+
+ "imip": The organizer accepts an iCalendar Message-Based
+ Interoperability Protocol (iMIP) [RFC6047] response at this email
+ address. The value MUST be a "mailto:" URI.
+
+ "web": Opening this URI in a web browser will provide the user with
+ a page where they can submit a reply to the organizer. The value
+ MUST be a URL using the "https:" scheme.
+
+ "other": The organizer is identified by this URI, but the method for
+ submitting the response is undefined.
+
+4.4.5. sentBy
+
+ Type: "String" (optional)
+
+ This is the email address in the "From" header of the email in which
+ this calendar object was received. This is only relevant if the
+ calendar object is received via iMIP or as an attachment to a
+ message. If set, the value MUST be a valid "addr-spec" value as
+ defined in Section 3.4.1 of [RFC5322].
+
+4.4.6. participants
+
+ Type: "Id[Participant]" (optional)
+
+ This is a map of participant ids to participants, describing their
+ participation in the calendar object.
+
+ If this property is set and any participant has a "sendTo" property,
+ then the "replyTo" property of this calendar object MUST define at
+ least one reply method.
+
+ A Participant object has the following properties:
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be
+ "Participant".
+
+ name: "String" (optional)
+ This is the display name of the participant (e.g., "Joe Bloggs").
+
+ email: "String" (optional)
+ This is the email address to use to contact the participant or,
+ for example, match with an address book entry. If set, the value
+ MUST be a valid "addr-spec" value as defined in Section 3.4.1 of
+ [RFC5322].
+
+ description: "String" (optional)
+ This is a plain-text description of this participant. For
+ example, this may include more information about their role in the
+ event or how best to contact them.
+
+ sendTo: "String[String]" (optional)
+ This represents methods by which the participant may receive the
+ invitation and updates to the calendar object.
+
+ The keys in the property value are the available methods and MUST
+ only contain ASCII alphanumeric characters (A-Za-z0-9). The value
+ is a URI for the method specified in the key. Future methods may
+ be defined in future specifications and registered with IANA; a
+ calendar client MUST ignore any method it does not understand but
+ MUST preserve the method key and URI. This property MUST be
+ omitted if no method is defined (rather than being specified as an
+ empty object).
+
+ The following methods are defined:
+
+ "imip": The participant accepts an iMIP [RFC6047] request at this
+ email address. The value MUST be a "mailto:" URI. It MAY be
+ different from the value of the participant's "email" property.
+
+ "other": The participant is identified by this URI, but the
+ method for submitting the invitation is undefined.
+
+ kind: "String" (optional)
+ This is what kind of entity this participant is, if known.
+
+ This MUST be one of the following values, another value registered
+ in the IANA "JSCalendar Enum Values" registry, or a vendor-
+ specific value (see Section 3.3). Any value the client or server
+ doesn't understand should be treated the same as if this property
+ is omitted.
+
+ "individual": a single person
+
+ "group": a collection of people invited as a whole
+
+ "location": a physical location that needs to be scheduled, e.g.,
+ a conference room
+
+ "resource": a non-human resource other than a location, such as a
+ projector
+
+ roles: "String[Boolean]" (mandatory)
+ This is a set of roles that this participant fulfills.
+
+ At least one role MUST be specified for the participant. The keys
+ in the set MUST be one of the following values, another value
+ registered in the IANA "JSCalendar Enum Values" registry, or a
+ vendor-specific value (see Section 3.3):
+
+ "owner": The participant is an owner of the object. This
+ signifies they have permission to make changes to it that
+ affect the other participants. Nonowner participants may only
+ change properties that affect only themselves (for example,
+ setting their own alerts or changing their RSVP status).
+
+ "attendee": The participant is expected to be present at the
+ event.
+
+ "optional": The participant's involvement with the event is
+ optional. This is expected to be primarily combined with the
+ "attendee" role.
+
+ "informational": The participant is copied for informational
+ reasons and is not expected to attend.
+
+ "chair": The participant is in charge of the event/task when it
+ occurs.
+
+ "contact": The participant is someone that may be contacted for
+ information about the event.
+
+ The value for each key in the map MUST be true. It is expected
+ that no more than one of the roles "attendee" and "informational"
+ be present; if more than one are given, "attendee" takes
+ precedence over "informational". Roles that are unknown to the
+ implementation MUST be preserved.
+
+ locationId: "Id" (optional)
+ This is the location at which this participant is expected to be
+ attending.
+
+ If the value does not correspond to any location id in the
+ "locations" property of the JSCalendar object, this MUST be
+ treated the same as if the participant's locationId were omitted.
+
+ language: "String" (optional)
+ This is the language tag, as defined in [RFC5646], that best
+ describes the participant's preferred language, if known.
+
+ participationStatus: "String" (optional, default: "needs-action")
+ This is the participation status, if any, of this participant.
+
+ The value MUST be one of the following values, another value
+ registered in the IANA "JSCalendar Enum Values" registry, or a
+ vendor-specific value (see Section 3.3):
+
+ "needs-action": No status has yet been set by the participant.
+
+ "accepted": The invited participant will participate.
+
+ "declined": The invited participant will not participate.
+
+ "tentative": The invited participant may participate.
+
+ "delegated": The invited participant has delegated their
+ attendance to another participant, as specified in the
+ "delegatedTo" property.
+
+ participationComment: "String" (optional)
+ This is a note from the participant to explain their participation
+ status.
+
+ expectReply: "Boolean" (optional, default: false)
+ If true, the organizer is expecting the participant to notify them
+ of their participation status.
+
+ scheduleAgent: "String" (optional, default: "server")
+ This is who is responsible for sending scheduling messages with
+ this calendar object to the participant.
+
+ The value MUST be one of the following values, another value
+ registered in the IANA "JSCalendar Enum Values" registry, or a
+ vendor-specific value (see Section 3.3):
+
+ "server": The calendar server will send the scheduling messages.
+
+ "client": The calendar client will send the scheduling messages.
+
+ "none": No scheduling messages are to be sent to this
+ participant.
+
+ scheduleForceSend: "Boolean" (optional, default: false)
+ A client may set the property on a participant to true to request
+ that the server send a scheduling message to the participant when
+ it would not normally do so (e.g., if no significant change is
+ made the object or the scheduleAgent is set to client). The
+ property MUST NOT be stored in the JSCalendar object on the server
+ or appear in a scheduling message.
+
+ scheduleSequence: "UnsignedInt" (optional, default: 0)
+ This is the sequence number of the last response from the
+ participant. If defined, this MUST be a nonnegative integer.
+
+ This can be used to determine whether the participant has sent a
+ new response following significant changes to the calendar object
+ and to determine if future responses are responding to a current
+ or older view of the data.
+
+ scheduleStatus: "String[]" (optional)
+ This is a list of status codes, returned from the processing of
+ the most recent scheduling message sent to this participant. The
+ status codes MUST be valid "statcode" values as defined in the
+ ABNF in Section 3.8.8.3 of [RFC5545].
+
+ Servers MUST only add or change this property when they send a
+ scheduling message to the participant. Clients SHOULD NOT change
+ or remove this property if it was provided by the server. Clients
+ MAY add, change, or remove the property for participants where the
+ client is handling the scheduling.
+
+ This property MUST NOT be included in scheduling messages.
+
+ scheduleUpdated: "UTCDateTime" (optional)
+ This is the timestamp for the most recent response from this
+ participant.
+
+ This is the "updated" property of the last response when using
+ iTIP. It can be compared to the "updated" property in future
+ responses to detect and discard older responses delivered out of
+ order.
+
+ sentBy: "String" (optional)
+ This is the email address in the "From" header of the email that
+ last updated this participant via iMIP. This SHOULD only be set
+ if the email address is different to that in the mailto URI of
+ this participant's "imip" method in the "sendTo" property (i.e.,
+ the response was received from a different address to that which
+ the invitation was sent to). If set, the value MUST be a valid
+ "addr-spec" value as defined in Section 3.4.1 of [RFC5322].
+
+ invitedBy: "Id" (optional)
+ This is the id of the participant who added this participant to
+ the event/task, if known.
+
+ delegatedTo: "Id[Boolean]" (optional)
+ This is set of participant ids that this participant has delegated
+ their participation to. Each key in the set MUST be the id of a
+ participant. The value for each key in the map MUST be true. If
+ there are no delegates, this MUST be omitted (rather than
+ specified as an empty set).
+
+ delegatedFrom: "Id[Boolean]" (optional)
+ This is a set of participant ids that this participant is acting
+ as a delegate for. Each key in the set MUST be the id of a
+ participant. The value for each key in the map MUST be true. If
+ there are no delegators, this MUST be omitted (rather than
+ specified as an empty set).
+
+ memberOf: "Id[Boolean]" (optional)
+ This is a set of group participants that were invited to this
+ calendar object, which caused this participant to be invited due
+ to their membership in the group(s). Each key in the set MUST be
+ the id of a participant. The value for each key in the map MUST
+ be true. If there are no groups, this MUST be omitted (rather
+ than specified as an empty set).
+
+ links: "Id[Link]" (optional)
+ This is a map of link ids to Link objects, representing external
+ resources associated with this participant, for example, a vCard
+ or image. If there are no links, this MUST be omitted (rather
+ than specified as an empty set).
+
+ progress: "String" (optional; only allowed for participants of a
+ Task)
+ This represents the progress of the participant for this task. It
+ MUST NOT be set if the "participationStatus" of this participant
+ is any value other than "accepted". See Section 5.2.5 for allowed
+ values and semantics.
+
+ progressUpdated: "UTCDateTime" (optional; only allowed for
+ participants of a Task)
+ This specifies the date-time the "progress" property was last set
+ on this participant. See Section 5.2.6 for allowed values and
+ semantics.
+
+ percentComplete: "UnsignedInt" (optional; only allowed for
+ participants of a Task)
+ This represents the percent completion of the participant for this
+ task. The property value MUST be a positive integer between 0 and
+ 100.
+
+4.4.7. requestStatus
+
+ Type: "String" (optional)
+
+ A request status as returned from processing the most recent
+ scheduling request for this JSCalendar object. The allowed values
+ are defined by the ABNF definitions of "statcode", "statdesc" and
+ "extdata" in Section 3.8.8.3 of [RFC5545] and the following ABNF
+ [RFC5234]:
+
+ reqstatus = statcode ";" statdesc [";" extdata]
+
+ Servers MUST only add or change this property when they performe a
+ scheduling action. Clients SHOULD NOT change or remove this property
+ if it was provided by the server. Clients MAY add, change, or remove
+ the property when the client is handling the scheduling.
+
+ This property MUST only be included in scheduling messages according
+ to the rules defined for the REQUEST-STATUS iCalendar property in
+ [RFC5546].
+
+4.5. Alerts Properties
+
+4.5.1. useDefaultAlerts
+
+ Type: "Boolean" (optional, default: false)
+
+ If true, use the user's default alerts and ignore the value of the
+ "alerts" property. Fetching user defaults is dependent on the API
+ from which this JSCalendar object is being fetched and is not defined
+ in this specification. If an implementation cannot determine the
+ user's default alerts, or none are set, it MUST process the "alerts"
+ property as if "useDefaultAlerts" is set to false.
+
+4.5.2. alerts
+
+ Type: "Id[Alert]" (optional)
+
+ This is a map of alert ids to Alert objects, representing alerts/
+ reminders to display or send to the user for this calendar object.
+
+ An Alert object has the following properties:
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be "Alert".
+
+ trigger: "OffsetTrigger|AbsoluteTrigger|UnknownTrigger"
+ (mandatory)
+ This defines when to trigger the alert. New types may be defined
+ in future documents.
+
+ An "OffsetTrigger" object has the following properties:
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be
+ "OffsetTrigger".
+
+ offset: "SignedDuration" (mandatory)
+ This defines the offset at which to trigger the alert relative
+ to the time property defined in the "relativeTo" property of
+ the alert. Negative durations signify alerts before the time
+ property; positive durations signify alerts after the time
+ property.
+
+ relativeTo: "String" (optional, default: "start")
+ This specifies the time property that the alert offset is
+ relative to. The value MUST be one of the following:
+
+ "start": triggers the alert relative to the start of the
+ calendar object
+
+ "end": triggers the alert relative to the end/due time of the
+ calendar object
+
+ An "AbsoluteTrigger" object has the following properties:
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be
+ "AbsoluteTrigger".
+
+ when: "UTCDateTime" (mandatory)
+ This defines a specific UTC date-time when the alert is
+ triggered.
+
+ An "UnknownTrigger" object is an object that contains an "@type"
+ property whose value is not recognized (i.e., not "OffsetTrigger"
+ or "AbsoluteTrigger") plus zero or more other properties. This is
+ for compatibility with client extensions and future
+ specifications. Implementations SHOULD NOT trigger for trigger
+ types they do not understand but MUST preserve them.
+
+ acknowledged: "UTCDateTime" (optional)
+ This records when an alert was last acknowledged. This is set
+ when the user has dismissed the alert; other clients that sync
+ this property SHOULD automatically dismiss or suppress duplicate
+ alerts (alerts with the same alert id that triggered on or before
+ this date-time).
+
+ For a recurring calendar object, setting the "acknowledged"
+ property MUST NOT add a new override to the "recurrenceOverrides"
+ property. If the alert is not already overridden, the
+ "acknowledged" property MUST be set on the alert in the base
+ event/task.
+
+ Certain kinds of alert action may not provide feedback as to when
+ the user sees them, for example, email-based alerts. For those
+ kinds of alerts, this property MUST be set immediately when the
+ alert is triggered and the action is successfully carried out.
+
+ relatedTo: "String[Relation]" (optional)
+ This relates this alert to other alerts in the same JSCalendar
+ object. If the user wishes to snooze an alert, the application
+ MUST create an alert to trigger after snoozing. This new snooze
+ alert MUST set a parent relation to the identifier of the original
+ alert.
+
+ action: "String" (optional, default: "display")
+ This describes how to alert the user.
+
+ The value MUST be at most one of the following values, a value
+ registered in the IANA "JSCalendar Enum Values" registry, or a
+ vendor-specific value (see Section 3.3):
+
+ "display": The alert should be displayed as appropriate for the
+ current device and user context.
+
+ "email": The alert should trigger an email sent out to the user,
+ notifying them of the alert. This action is typically only
+ appropriate for server implementations.
+
+4.6. Multilingual Properties
+
+4.6.1. localizations
+
+ Type: "String[PatchObject]" (optional)
+
+ A map where each key is a language tag [RFC5646], and the
+ corresponding value is a set of patches to apply to the calendar
+ object in order to localize it into that locale.
+
+ See the description of PatchObject (Section 1.4.9) for the structure
+ of the PatchObject. The patches are applied to the top-level
+ calendar object. In addition, the "locale" property of the patched
+ object is set to the language tag. All pointers for patches MUST end
+ with one of the following suffixes; any patch that does not follow
+ this MUST be ignored unless otherwise specified in a future RFC:
+
+ * title
+
+ * description
+
+ * name
+
+ A patch MUST NOT have the prefix "recurrenceOverrides"; any
+ localization of the override MUST be a patch to the "localizations"
+ property inside the override instead. For example, a patch to
+ "locations/abcd1234/title" is permissible, but a patch to "uid" or
+ "recurrenceOverrides/2020-01-05T14:00:00/title" is not.
+
+ Note that this specification does not define how to maintain validity
+ of localized content. For example, a client application changing a
+ JSCalendar object's "title" property might also need to update any
+ localizations of this property. Client implementations SHOULD
+ provide the means to manage localizations, but how to achieve this is
+ specific to the application's workflow and requirements.
+
+4.7. Time Zone Properties
+
+4.7.1. timeZone
+
+ Type: "TimeZoneId|null" (optional, default: null)
+
+ This identifies the time zone the object is scheduled in or is null
+ for floating time. This is either a name from the IANA Time Zone
+ Database [TZDB] or the TimeZoneId of a custom time zone from the
+ "timeZones" property (Section 4.7.2). If omitted, this MUST be
+ presumed to be null (i.e., floating time).
+
+4.7.2. timeZones
+
+ Type: "TimeZoneId[TimeZone]" (optional)
+
+ This maps identifiers of custom time zones to their time zone
+ definitions. The following restrictions apply for each key in the
+ map:
+
+ * To avoid conflict with names in the IANA Time Zone Database
+ [TZDB], it MUST start with the "/" character.
+
+ * It MUST be a valid "paramtext" value, as specified in Section 3.1
+ of [RFC5545].
+
+ * At least one other property in the same JSCalendar object MUST
+ reference a time zone using this identifier (i.e., orphaned time
+ zones are not allowed).
+
+ An identifier need only be unique to this JSCalendar object. It MAY
+ differ from the "tzId" property value of the TimeZone object it maps
+ to.
+
+ A JSCalendar object may be part of a hierarchy of other JSCalendar
+ objects (say, an Event is an entry in a Group). In this case, the
+ set of time zones is the sum of the time zone definitions of this
+ object and its parent objects. If multiple time zones with the same
+ identifier exist, then the definition closest to the calendar object
+ in relation to its parents MUST be used. (In context of Event, a
+ time zone definition in its "timeZones" property has precedence over
+ a definition of the same id in the Group). Time zone definitions in
+ any children of the calendar object MUST be ignored.
+
+ A TimeZone object maps a VTIMEZONE component from iCalendar, and the
+ semantics are as defined in [RFC5545]. A valid time zone MUST define
+ at least one transition rule in the "standard" or "daylight"
+ property. Its properties are:
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be "TimeZone".
+
+ tzId: "String" (mandatory)
+ This is the TZID property from iCalendar. Note that this implies
+ that the value MUST be a valid "paramtext" value as specified in
+ Section 3.1. of [RFC5545].
+
+ updated: "UTCDateTime" (optional)
+ This is the LAST-MODIFIED property from iCalendar.
+
+ url: "String" (optional)
+ This is the TZURL property from iCalendar.
+
+ validUntil: "UTCDateTime" (optional)
+ This is the TZUNTIL property from iCalendar, specified in
+ [RFC7808].
+
+ aliases: "String[Boolean]" (optional)
+ This maps the TZID-ALIAS-OF properties from iCalendar, specified
+ in [RFC7808], to a JSON set of aliases. The set is represented as
+ an object, with the keys being the aliases. The value for each
+ key in the map MUST be true.
+
+ standard: "TimeZoneRule[]" (optional)
+ This the STANDARD sub-components from iCalendar. The order MUST
+ be preserved during conversion.
+
+ daylight: "TimeZoneRule[]" (optional)
+ This the DAYLIGHT sub-components from iCalendar. The order MUST
+ be preserved during conversion.
+
+ A TimeZoneRule object maps a STANDARD or DAYLIGHT sub-component from
+ iCalendar, with the restriction that, at most, one recurrence rule is
+ allowed per rule. It has the following properties:
+
+ @type: "String" (mandatory)
+ This specifies the type of this object. This MUST be
+ "TimeZoneRule".
+
+ start: "LocalDateTime" (mandatory)
+ This is the DTSTART property from iCalendar.
+
+ offsetFrom: "String" (mandatory)
+ This is the TZOFFSETFROM property from iCalendar.
+
+ offsetTo: "String" (mandatory)
+ This is the TZOFFSETTO property from iCalendar.
+
+ recurrenceRules: "RecurrenceRule[]" (optional)
+ This is the RRULE property mapped, as specified in Section 4.3.3.
+ During recurrence rule evaluation, the "until" property value MUST
+ be interpreted as a local time in the UTC time zone.
+
+ recurrenceOverrides: "LocalDateTime[PatchObject]" (optional)
+ This maps the RDATE properties from iCalendar. The set is
+ represented as an object, with the keys being the recurrence
+ dates. The patch object MUST be the empty JSON object ({}).
+
+ names: "String[Boolean]" optional)
+ This maps the TZNAME properties from iCalendar to a JSON set. The
+ set is represented as an object, with the keys being the names,
+ excluding any "tznparam" component from iCalendar. The value for
+ each key in the map MUST be true.
+
+ comments: "String[]" (optional)
+ This maps the COMMENT properties from iCalendar. The order MUST
+ be preserved during conversion.
+
+5. Type-Specific JSCalendar Properties
+
+5.1. Event Properties
+
+ In addition to the common JSCalendar object properties (Section 4),
+ an Event has the following properties:
+
+5.1.1. start
+
+ Type: "LocalDateTime" (mandatory)
+
+ This is the date/time the event starts in the event's time zone (as
+ specified in the "timeZone" property, see Section 4.7.1).
+
+5.1.2. duration
+
+ Type: "Duration" (optional, default: "PT0S")
+
+ This is the zero or positive duration of the event in the event's
+ start time zone. The end time of an event can be found by adding the
+ duration to the event's start time.
+
+ An Event MAY involve start and end locations that are in different
+ time zones (e.g., a transcontinental flight). This can be expressed
+ using the "relativeTo" and "timeZone" properties of the Event's
+ Location objects (see Section 4.2.5).
+
+5.1.3. status
+
+ Type: "String" (optional, default: "confirmed")
+
+ This is the scheduling status (Section 4.4) of an Event. If set, it
+ MUST be one of the following values, another value registered in the
+ IANA "JSCalendar Enum Values" registry, or a vendor-specific value
+ (see Section 3.3):
+
+ "confirmed": indicates the event is definitely happening
+
+ "cancelled": indicates the event has been cancelled
+
+ "tentative": indicates the event may happen
+
+5.2. Task Properties
+
+ In addition to the common JSCalendar object properties (Section 4), a
+ Task has the following properties:
+
+5.2.1. due
+
+ Type: "LocalDateTime" (optional)
+
+ This is the date/time the task is due in the task's time zone.
+
+5.2.2. start
+
+ Type: "LocalDateTime" (optional)
+
+ This the date/time the task should start in the task's time zone.
+
+5.2.3. estimatedDuration
+
+ Type: "Duration" (optional)
+
+ This specifies the estimated positive duration of time the task takes
+ to complete.
+
+5.2.4. percentComplete
+
+ Type: "UnsignedInt" (optional)
+
+ This represents the percent completion of the task overall. The
+ property value MUST be a positive integer between 0 and 100.
+
+5.2.5. progress
+
+ Type: "String" (optional)
+
+ This defines the progress of this task. If omitted, the default
+ progress (Section 4.4) of a Task is defined as follows (in order of
+ evaluation):
+
+ "completed": if the "progress" property value of all participants is
+ "completed"
+
+ "failed": if at least one "progress" property value of a participant
+ is "failed"
+
+ "in-process": if at least one "progress" property value of a
+ participant is "in-process"
+
+ "needs-action": if none of the other criteria match
+
+ If set, it MUST be one of the following values, another value
+ registered in the IANA "JSCalendar Enum Values" registry, or a
+ vendor-specific value (see Section 3.3):
+
+ "needs-action": indicates the task needs action
+
+ "in-process": indicates the task is in process
+
+ "completed": indicates the task is completed
+
+ "failed": indicates the task failed
+
+ "cancelled": indicates the task was cancelled
+
+5.2.6. progressUpdated
+
+ Type: "UTCDateTime" (optional)
+
+ This specifies the date/time the "progress" property of either the
+ task overall (Section 5.2.5) or a specific participant
+ (Section 4.4.6) was last updated.
+
+ If the task is recurring and has future instances, a client may want
+ to keep track of the last progress update timestamp of a specific
+ task recurrence but leave other instances unchanged. One way to
+ achieve this is by overriding the "progressUpdated" property in the
+ task "recurrenceOverrides" property. However, this could produce a
+ long list of timestamps for regularly recurring tasks. An
+ alternative approach is to split the Task into a current, single
+ instance of Task with this instance progress update time and a future
+ recurring instance. See also Section 4.1.3 on splitting.
+
+5.3. Group Properties
+
+ Group supports the following common JSCalendar properties
+ (Section 4):
+
+ * @type
+
+ * uid
+
+ * prodId
+
+ * created
+
+ * updated
+
+ * title
+
+ * description
+
+ * descriptionContentType
+
+ * links
+
+ * locale
+
+ * keywords
+
+ * categories
+
+ * color
+
+ * timeZones
+
+ In addition, the following Group-specific properties are supported:
+
+5.3.1. entries
+
+ Type: "(Task|Event)[]" (mandatory)
+
+ This is a collection of group members. Implementations MUST ignore
+ entries of unknown type.
+
+5.3.2. source
+
+ Type: "String" (optional)
+
+ This is the source from which updated versions of this group may be
+ retrieved. The value MUST be a URI.
+
+6. Examples
+
+ The following examples illustrate several aspects of the JSCalendar
+ data model and format. The examples may omit mandatory or additional
+ properties, which is indicated by a placeholder property with key
+ "...". While most of the examples use calendar event objects, they
+ are also illustrative for tasks.
+
+6.1. Simple Event
+
+ This example illustrates a simple one-time event. It specifies a
+ one-time event that begins on January 15, 2020 at 1 pm New York local
+ time and ends after 1 hour.
+
+ {
+ "@type": "Event",
+ "uid": "a8df6573-0474-496d-8496-033ad45d7fea",
+ "updated": "2020-01-02T18:23:04Z",
+ "title": "Some event",
+ "start": "2020-01-15T13:00:00",
+ "timeZone": "America/New_York",
+ "duration": "PT1H"
+ }
+
+6.2. Simple Task
+
+ This example illustrates a simple task for a plain to-do item.
+
+ {
+ "@type": "Task",
+ "uid": "2a358cee-6489-4f14-a57f-c104db4dc2f2",
+ "updated": "2020-01-09T14:32:01Z",
+ "title": "Do something"
+ }
+
+6.3. Simple Group
+
+ This example illustrates a simple calendar object group that contains
+ an event and a task.
+
+ {
+ "@type": "Group",
+ "uid": "bf0ac22b-4989-4caf-9ebd-54301b4ee51a",
+ "updated": "2020-01-15T18:00:00Z",
+ "name": "A simple group",
+ "entries": [{
+ "@type": "Event",
+ "uid": "a8df6573-0474-496d-8496-033ad45d7fea",
+ "updated": "2020-01-02T18:23:04Z",
+ "title": "Some event",
+ "start": "2020-01-15T13:00:00",
+ "timeZone": "America/New_York",
+ "duration": "PT1H"
+ },
+ {
+ "@type": "Task",
+ "uid": "2a358cee-6489-4f14-a57f-c104db4dc2f2",
+ "updated": "2020-01-09T14:32:01Z",
+ "title": "Do something"
+ }]
+ }
+
+6.4. All-Day Event
+
+ This example illustrates an event for an international holiday. It
+ specifies an all-day event on April 1 that occurs every year since
+ the year 1900.
+
+ {
+ "...": "",
+ "title": "April Fool's Day",
+ "showWithoutTime": true,
+ "start": "1900-04-01T00:00:00",
+ "duration": "P1D",
+ "recurrenceRules": [{
+ "@type": "RecurrenceRule",
+ "frequency": "yearly"
+ }]
+ }
+
+6.5. Task with a Due Date
+
+ This example illustrates a task with a due date. It is a reminder to
+ buy groceries before 6 pm Vienna local time on January 19, 2020. The
+ calendar user expects to need 1 hour for shopping.
+
+ {
+ "...": "",
+ "title": "Buy groceries",
+ "due": "2020-01-19T18:00:00",
+ "timeZone": "Europe/Vienna",
+ "estimatedDuration": "PT1H"
+ }
+
+6.6. Event with End Time Zone
+
+ This example illustrates the use of end time zones by use of an
+ international flight. The flight starts on April 1, 2020 at 9 am in
+ Berlin local time. The duration of the flight is scheduled at 10
+ hours 30 minutes. The time at the flight's destination is in the
+ same time zone as Tokyo. Calendar clients could use the end time
+ zone to display the arrival time in Tokyo local time and highlight
+ the time zone difference of the flight. The location names can serve
+ as input for navigation systems.
+
+ {
+ "...": "",
+ "title": "Flight XY51 to Tokyo",
+ "start": "2020-04-01T09:00:00",
+ "timeZone": "Europe/Berlin",
+ "duration": "PT10H30M",
+ "locations": {
+ "1": {
+ "@type": "Location",
+ "rel": "start",
+ "name": "Frankfurt Airport (FRA)"
+ },
+ "2": {
+ "@type": "Location",
+ "rel": "end",
+ "name": "Narita International Airport (NRT)",
+ "timeZone": "Asia/Tokyo"
+ }
+ }
+ }
+
+6.7. Floating-Time Event (with Recurrence)
+
+ This example illustrates the use of floating time. Since January 1,
+ 2020, a calendar user blocks 30 minutes every day to practice yoga at
+ 7 am local time in whatever time zone the user is located on that
+ date.
+
+ {
+ "...": "",
+ "title": "Yoga",
+ "start": "2020-01-01T07:00:00",
+ "duration": "PT30M",
+ "recurrenceRules": [{
+ "@type": "RecurrenceRule",
+ "frequency": "daily"
+ }]
+ }
+
+6.8. Event with Multiple Locations and Localization
+
+ This example illustrates an event that happens at both a physical and
+ a virtual location. Fans can see a live concert on premises or
+ online. The event title and descriptions are localized.
+
+ {
+ "...": "",
+ "title": "Live from Music Bowl: The Band",
+ "description": "Go see the biggest music event ever!",
+ "locale": "en",
+ "start": "2020-07-04T17:00:00",
+ "timeZone": "America/New_York",
+ "duration": "PT3H",
+ "locations": {
+ "c0503d30-8c50-4372-87b5-7657e8e0fedd": {
+ "@type": "Location",
+ "name": "The Music Bowl",
+ "description": "Music Bowl, Central Park, New York",
+ "coordinates": "geo:40.7829,-73.9654"
+ }
+ },
+ "virtualLocations": {
+ "vloc1": {
+ "@type": "VirtualLocation",
+ "name": "Free live Stream from Music Bowl",
+ "uri": "https://stream.example.com/the_band_2020"
+ }
+ },
+ "localizations": {
+ "de": {
+ "title": "Live von der Music Bowl: The Band!",
+ "description": "Schau dir das größte Musikereignis an!",
+ "virtualLocations/vloc1/name":
+ "Gratis Live-Stream aus der Music Bowl"
+ }
+ }
+ }
+
+6.9. Recurring Event with Overrides
+
+ This example illustrates the use of recurrence overrides. A math
+ course at a university is held for the first time on January 8, 2020
+ at 9 am London time and occurs every week until June 24, 2020. Each
+ lecture lasts for one hour and 30 minutes and is located at the
+ Mathematics department. This event has exceptional occurrences: at
+ the last occurrence of the course is an exam, which lasts for 2 hours
+ and starts at 10 am. Also, the location of the exam differs from the
+ usual location. On April 1, no course is held. On January 7 at 2
+ pm, there is an optional introduction course, which occurs before the
+ first regular lecture.
+
+ {
+ "...": "",
+ "title": "Calculus I",
+ "start": "2020-01-08T09:00:00",
+ "timeZone": "Europe/London",
+ "duration": "PT1H30M",
+ "locations": {
+ "mlab": {
+ "@type": "Location",
+ "title": "Math lab room 1",
+ "description": "Math Lab I, Department of Mathematics"
+ }
+ },
+ "recurrenceRules": [{
+ "@type": "RecurrenceRule",
+ "frequency": "weekly",
+ "until": "2020-06-24T09:00:00"
+ }],
+ "recurrenceOverrides": {
+ "2020-01-07T14:00:00": {
+ "title": "Introduction to Calculus I (optional)"
+ },
+ "2020-04-01T09:00:00": {
+ "excluded": true
+ },
+ "2020-06-25T09:00:00": {
+ "title": "Calculus I Exam",
+ "start": "2020-06-25T10:00:00",
+ "duration": "PT2H",
+ "locations": {
+ "auditorium": {
+ "@type": "Location",
+ "title": "Big Auditorium",
+ "description": "Big Auditorium, Other Road"
+ }
+ }
+ }
+ }
+ }
+
+6.10. Recurring Event with Participants
+
+ This example illustrates scheduled events. A team meeting occurs
+ every week since January 8, 2020 at 9 am Johannesburg time. The
+ event owner also chairs the event. Participants meet in a virtual
+ meeting room. An attendee has accepted the invitation, but, on March
+ 4, 2020, he is unavailable and declined participation for this
+ occurrence.
+
+ {
+ "...": "",
+ "title": "FooBar team meeting",
+ "start": "2020-01-08T09:00:00",
+ "timeZone": "Africa/Johannesburg",
+ "duration": "PT1H",
+ "virtualLocations": {
+ "0": {
+ "@type": "VirtualLocation",
+ "name": "ChatMe meeting room",
+ "uri": "https://chatme.example.com?id=1234567&pw=a8a24627b63d"
+ }
+ },
+ "recurrenceRules": [{
+ "@type": "RecurrenceRule",
+ "frequency": "weekly"
+ }],
+ "replyTo": {
+ "imip": "mailto:f245f875-7f63-4a5e-a2c8@schedule.example.com"
+ },
+ "participants": {
+ "dG9tQGZvb2Jhci5xlLmNvbQ": {
+ "@type": "Participant",
+ "name": "Tom Tool",
+ "email": "tom@foobar.example.com",
+ "sendTo": {
+ "imip": "mailto:tom@calendar.example.com"
+ },
+ "participationStatus": "accepted",
+ "roles": {
+ "attendee": true
+ }
+ },
+ "em9lQGZvb2GFtcGxlLmNvbQ": {
+ "@type": "Participant",
+ "name": "Zoe Zelda",
+ "email": "zoe@foobar.example.com",
+ "sendTo": {
+ "imip": "mailto:zoe@foobar.example.com"
+ },
+ "participationStatus": "accepted",
+ "roles": {
+ "owner": true,
+ "attendee": true,
+ "chair": true
+ }
+ }
+ },
+ "recurrenceOverrides": {
+ "2020-03-04T09:00:00": {
+ "participants/dG9tQGZvb2Jhci5xlLmNvbQ/participationStatus":
+ "declined"
+ }
+ }
+ }
+
+7. Security Considerations
+
+ Calendaring and scheduling information is very privacy sensitive. It
+ can reveal the social network of a user, location information of this
+ user and those in their social network, identity and credentials
+ information, and patterns of behavior of the user in both the
+ physical and cyber realm. Additionally, calendar events and tasks
+ can influence the physical location of a user or their cyber behavior
+ within a known time window. Its transmission and storage must be
+ done carefully to protect it from possible threats, such as
+ eavesdropping, replay, message insertion, deletion, modification, and
+ on-path attacks.
+
+ The data being stored and transmitted may be used in systems with
+ real-world consequences. For example, a home automation system may
+ turn an alarm on and off or a coworking space may charge money to the
+ organizer of an event that books one of their meeting rooms. Such
+ systems must be careful to authenticate all data they receive to
+ prevent them from being subverted and ensure the change comes from an
+ authorized entity.
+
+ This document only defines the data format; such considerations are
+ primarily the concern of the API or method of storage and
+ transmission of such files.
+
+7.1. Expanding Recurrences
+
+ A recurrence rule may produce infinite occurrences of an event.
+ Implementations MUST handle expansions carefully to prevent
+ accidental or deliberate resource exhaustion.
+
+ Conversely, a recurrence rule may be specified that does not expand
+ to anything. It is not always possible to tell this through static
+ analysis of the rule, so implementations MUST be careful to avoid
+ getting stuck in infinite loops or otherwise exhausting resources
+ while searching for the next occurrence.
+
+ Events recur in the event's time zone. If the user is in a different
+ time zone, daylight saving transitions may cause an event that
+ normally occurs at, for example, 9 am to suddenly shift an hour
+ earlier. This may be used in an attempt to cause a participant to
+ miss an important meeting. User agents must be careful to translate
+ date-times correctly between time zones and may wish to call out
+ unexpected changes in the time of a recurring event.
+
+7.2. JSON Parsing
+
+ The security considerations of [RFC8259] apply to the use of JSON as
+ the data interchange format.
+
+ As for any serialization format, parsers need to thoroughly check the
+ syntax of the supplied data. JSON uses opening and closing tags for
+ several types and structures, and it is possible that the end of the
+ supplied data will be reached when scanning for a matching closing
+ tag; this is an error condition, and implementations need to stop
+ scanning at the end of the supplied data.
+
+ JSON also uses a string encoding with some escape sequences to encode
+ special characters within a string. Care is needed when processing
+ these escape sequences to ensure that they are fully formed before
+ the special processing is triggered, with special care taken when the
+ escape sequences appear adjacent to other (non-escaped) special
+ characters or adjacent to the end of data (as in the previous
+ paragraph).
+
+ If parsing JSON into a non-textual structured data format,
+ implementations may need to allocate storage to hold JSON string
+ elements. Since JSON does not use explicit string lengths, the risk
+ of denial of service due to resource exhaustion is small, but
+ implementations may still wish to place limits on the size of
+ allocations they are willing to make in any given context, to avoid
+ untrusted data causing excessive memory allocation.
+
+7.3. URI Values
+
+ Several JSCalendar properties contain URIs as values, and processing
+ these properties requires extra care. Section 7 of [RFC3986]
+ discusses security risks related to URIs.
+
+ Fetching remote resources carries inherent risks. Connections must
+ only be allowed on well-known ports, using allowed protocols
+ (generally, just HTTP/HTTPS on their default ports). The URL must be
+ resolved externally and not allowed to access internal resources.
+ Connecting to an external source reveals IP (and therefore often
+ location) information.
+
+ A maliciously constructed JSCalendar object may contain a very large
+ number of URIs. In the case of published calendars with a large
+ number of subscribers, such objects could be widely distributed.
+ Implementations should be careful to limit the automatic fetching of
+ linked resources to reduce the risk of this being an amplification
+ vector for a denial-of-service attack.
+
+7.4. Spam
+
+ Calendar systems may receive JSCalendar files from untrusted sources,
+ in particular, as attachments to emails. This can be a vector for an
+ attacker to inject spam into a user's calendar. This may confuse,
+ annoy, and mislead users or overwhelm their calendar with bogus
+ events, preventing them from seeing legitimate ones.
+
+ Heuristic, statistical, or machine-learning-based filters can be
+ effective in filtering out spam. Authentication mechanisms, such as
+ DomainKeys Identified Mail (DKIM) [RFC6376], can help establish the
+ source of messages and associate the data with existing relationships
+ (such as an address book contact). However, misclassifications are
+ always possible and providing a mechanism for users to quickly
+ correct this is advised.
+
+ Confusable unicode characters may be used to trick a user into
+ trusting a JSCalendar file that appears to come from a known contact
+ but is actually from a similar-looking source controlled by an
+ attacker.
+
+7.5. Duplication
+
+ It is important for calendar systems to maintain the UID of an event
+ when updating it to avoid an unexpected duplication of events.
+ Consumers of the data may not remove the previous version of the
+ event if it has a different UID. This can lead to a confusing
+ situation for the user, with many variations of the event and no
+ indication of which one is correct. Care must be taken by consumers
+ of the data to remove old events where possible to avoid an
+ accidental denial-of-service attack due to the volume of data.
+
+7.6. Time Zones
+
+ Events recur in a particular time zone. When this differs from the
+ user's current time zone, it may unexpectedly cause an occurrence to
+ shift in time for that user due to a daylight savings change in the
+ event's time zone. A maliciously crafted event could attempt to
+ confuse users with such an event to ensure a meeting is missed.
+
+8. IANA Considerations
+
+8.1. Media Type Registration
+
+ This document defines a media type for use with JSCalendar data
+ formatted in JSON.
+
+ Type name: application
+
+ Subtype name: jscalendar+json
+
+ Required parameters: type
+
+ The "type" parameter conveys the type of the JSCalendar data in
+ the body part. The allowed parameter values correspond to the
+ "@type" property of the JSON-formatted JSCalendar object in the
+ body:
+
+ "event": The "@type" property value MUST be "Event".
+
+ "task": The "@type" property value MUST be "Task".
+
+ "group": The "@type" property value MUST be "Group".
+
+ No other parameter values are allowed. The parameter MUST NOT
+ occur more than once.
+
+ Optional parameters: none
+
+ Encoding considerations: This is the same as the encoding
+ considerations of application/json, as specified in Section 11 of
+ [RFC8259].
+
+ Security considerations: See Section 7 of this document.
+
+ Interoperability considerations: While JSCalendar is designed to
+ avoid ambiguities as much as possible, when converting objects
+ from other calendar formats to/from JSCalendar, it is possible
+ that differing representations for the same logical data or
+ ambiguities in interpretation might arise. The semantic
+ equivalence of two JSCalendar objects may be determined
+ differently by different applications, for example, where URL
+ values differ in case between the two objects.
+
+ Published specification: RFC 8984
+
+ Applications that use this media type: Applications that currently
+ make use of the text/calendar and application/calendar+json media
+ types can use this as an alternative. Similarly, applications
+ that use the application/json media type to transfer calendaring
+ data can use this to further specify the content.
+
+ Fragment identifier considerations: A JSON Pointer fragment
+ identifier may be used, as defined in [RFC6901], Section 6.
+
+ Additional information: Magic number(s): N/A
+
+ File extensions(s): N/A
+
+ Macintosh file type code(s): N/A
+
+ Person & email address to contact for further information:
+ calsify@ietf.org
+
+ Intended usage: COMMON
+
+ Restrictions on usage: N/A
+
+ Author: See the "Author's Address" section of this document.
+
+ Change controller: IETF
+
+8.2. Creation of the "JSCalendar Properties" Registry
+
+ IANA has created the "JSCalendar Properties" registry to allow
+ interoperability of extensions to JSCalendar objects.
+
+ This registry follows the Expert Review process ([RFC8126],
+ Section 4.5). If the "Intended Usage" field is "common", sufficient
+ documentation is required to enable interoperability. Preliminary
+ community review for this registry is optional but strongly
+ encouraged.
+
+ A registration can have an intended usage of "common", "reserved", or
+ "obsolete". IANA will list registrations with a common usage
+ designation prominently and separately from those with other intended
+ usage values.
+
+ A "reserved" registration reserves a property name without assigning
+ semantics to avoid name collisions with future extensions or protocol
+ use.
+
+ An "obsolete" registration denotes a property that is no longer
+ expected to be added by up-to-date systems. A new property has
+ probably been defined covering the obsolete property's semantics.
+
+ The JSCalendar property registration procedure is not a formal
+ standards process but rather an administrative procedure intended to
+ allow community comment and check it is coherent without excessive
+ time delay. It is designed to encourage vendors to document and
+ register new properties they add for use cases not covered by the
+ original specification, leading to increased interoperability.
+
+8.2.1. Preliminary Community Review
+
+ Notice of a potential new registration SHOULD be sent to the Calext
+ mailing list <calsify@ietf.org> for review. This mailing list is
+ appropriate to solicit community feedback on a proposed new property.
+
+ Property registrations must be marked with their intended use:
+ "common", "reserved", or "obsolete".
+
+ The intent of the public posting to this list is to solicit comments
+ and feedback on the choice of the property name, the unambiguity of
+ the specification document, and a review of any interoperability or
+ security considerations. The submitter may submit a revised
+ registration proposal or abandon the registration completely at any
+ time.
+
+8.2.2. Submit Request to IANA
+
+ Registration requests can be sent to <iana@iana.org>.
+
+8.2.3. Designated Expert Review
+
+ The primary concern of the designated expert (DE) is preventing name
+ collisions and encouraging the submitter to document security and
+ privacy considerations. For a common-use registration, the DE is
+ expected to confirm that suitable documentation, as described in
+ Section 4.6 of [RFC8126], is available to ensure interoperability.
+ That documentation will usually be in an RFC, but simple definitions
+ are likely to use a web/wiki page, and if a sentence or two is deemed
+ sufficient, it could be described in the registry itself. The DE
+ should also verify that the property name does not conflict with work
+ that is active or already published within the IETF. A published
+ specification is not required for reserved or obsolete registrations.
+
+ The DE will either approve or deny the registration request and
+ publish a notice of the decision to the Calext WG mailing list or its
+ successor, as well as inform IANA. A denial notice must be justified
+ by an explanation, and, in the cases where it is possible, concrete
+ suggestions on how the request can be modified so as to become
+ acceptable should be provided.
+
+8.2.4. Change Procedures
+
+ Once a JSCalendar property has been published by IANA, the change
+ controller may request a change to its definition. The same
+ procedure that would be appropriate for the original registration
+ request is used to process a change request.
+
+ JSCalendar property registrations may not be deleted; properties that
+ are no longer believed appropriate for use can be declared obsolete
+ by a change to their "intended usage" field; such properties will be
+ clearly marked in the IANA registry.
+
+ Significant changes to a JSCalendar property's definition should be
+ requested only when there are serious omissions or errors in the
+ published specification, as such changes may cause interoperability
+ issues. When review is required, a change request may be denied if
+ it renders entities that were valid under the previous definition
+ invalid under the new definition.
+
+ The owner of a JSCalendar property may pass responsibility to another
+ person or agency by informing IANA; this can be done without
+ discussion or review.
+
+8.2.5. "JSCalendar Properties" Registry Template
+
+ Property Name: This is the name of the property. The property name
+ MUST NOT already be registered for any of the object types listed
+ in the "Property Context" field of this registration. Other
+ object types MAY already have registered a different property with
+ the same name; however, the same name SHOULD only be used when the
+ semantics are analogous.
+
+ Property Type: This is the type of this property, using type
+ signatures, as specified in Section 1.3. The property type MUST
+ be registered in the "JSCalendar Types" registry.
+
+ Property Context: This is a comma-separated list of JSCalendar
+ object types this property is allowed on.
+
+ Reference or Description: This is a brief description or RFC number
+ and section reference where the property is specified (omitted for
+ "reserved" property names).
+
+ Intended Usage: This may be "common", "reserved", or "obsolete".
+
+ Change Controller: This is who may request a change to this entry's
+ definition ("IETF" for RFCs from the IETF stream).
+
+8.2.6. Initial Contents for the "JSCalendar Properties" Registry
+
+ The following table lists the initial entries of the "JSCalendar
+ Properties" registry. All properties are for common use. All RFC
+ section references are for this document. The change controller for
+ all these properties is "IETF".
+
+ +====================+=================+================+===========+
+ |Property Name |Property Type |Property Context|Reference |
+ | | | |or |
+ | | | |Description|
+ +====================+=================+================+===========+
+ |@type |String |Event, Task, |Section |
+ | | |Group, |4.1.1, |
+ | | |AbsoluteTrigger,|Section |
+ | | |Alert, Link, |4.5.2, |
+ | | |Location, NDay, |Section |
+ | | |OffsetTrigger, |1.4.11, |
+ | | |Participant, |Section |
+ | | |RecurrenceRule, |4.2.5, |
+ | | |Relation, |Section |
+ | | |TimeZone, |4.4.6, |
+ | | |TimeZoneRule, |Section |
+ | | |VirtualLocation |4.3.3, |
+ | | | |Section |
+ | | | |1.4.10, |
+ | | | |Section |
+ | | | |4.7.2, |
+ | | | |Section |
+ | | | |4.2.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |acknowledged |UTCDateTime |Alert |Section |
+ | | | |4.5.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |action |String |Alert |Section |
+ | | | |4.5.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |alerts |Id[Alert] |Event, Task |Section |
+ | | | |4.5.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |aliases |String[Boolean] |TimeZone |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |byDay |NDay[] |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |byHour |UnsignedInt[] |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |byMinute |UnsignedInt[] |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |byMonth |String[] |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |byMonthDay |Int[] |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |bySecond |UnsignedInt[] |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |bySetPosition |Int[] |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |byWeekNo |Int[] |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |byYearDay |Int[] |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |categories |String[Boolean] |Event, Task, |Section |
+ | | |Group |4.2.10 |
+ +--------------------+-----------------+----------------+-----------+
+ |cid |String |Link |Section |
+ | | | |1.4.11 |
+ +--------------------+-----------------+----------------+-----------+
+ |color |String |Event, Task, |Section |
+ | | |Group |4.2.11 |
+ +--------------------+-----------------+----------------+-----------+
+ |comments |String[] |TimeZoneRule |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |contentType |String |Link |Section |
+ | | | |1.4.11 |
+ +--------------------+-----------------+----------------+-----------+
+ |coordinates |String |Location |Section |
+ | | | |4.2.5 |
+ +--------------------+-----------------+----------------+-----------+
+ |count |UnsignedInt |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |created |UTCDateTime |Event, Task, |Section |
+ | | |Group |4.1.5 |
+ +--------------------+-----------------+----------------+-----------+
+ |day |String |NDay |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |daylight |TimeZoneRule[] |TimeZone |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |delegatedFrom |Id[Boolean] |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |delegatedTo |Id[Boolean] |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |description |String |Event, Task, |Section |
+ | | |Location, |4.2.2, |
+ | | |Participant, |Section |
+ | | |VirtualLocation |4.2.5, |
+ | | | |Section |
+ | | | |4.4.6, |
+ | | | |Section |
+ | | | |4.2.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |description |String |Event, Task |Section |
+ |ContentType | | |4.2.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |display |String |Link |Section |
+ | | | |1.4.11 |
+ +--------------------+-----------------+----------------+-----------+
+ |due |LocalDateTime |Task |Section |
+ | | | |5.2.1 |
+ +--------------------+-----------------+----------------+-----------+
+ |duration |Duration |Event |Section |
+ | | | |5.1.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |email |String |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |entries |(Task|Event)[] |Group |Section |
+ | | | |5.3.1 |
+ +--------------------+-----------------+----------------+-----------+
+ |estimatedDuration |Duration |Task |Section |
+ | | | |5.2.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |excluded |Boolean |Event, Task |Section |
+ | | | |4.3.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |excluded |RecurrenceRule[] |Event, Task |Section |
+ |RecurrenceRules | | |4.3.4 |
+ +--------------------+-----------------+----------------+-----------+
+ |expectReply |Boolean |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |features |String[Boolean] |VirtualLocation |Section |
+ | | | |4.2.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |firstDayOfWeek |String |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |freeBusyStatus |String |Event, Task |Section |
+ | | | |4.4.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |frequency |String |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |href |String |Link |Section |
+ | | | |1.4.11 |
+ +--------------------+-----------------+----------------+-----------+
+ |interval |UnsignedInt |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |invitedBy |Id |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |keywords |String[Boolean] |Event, Task, |Section |
+ | | |Group |4.2.9 |
+ +--------------------+-----------------+----------------+-----------+
+ |kind |String |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |language |String |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |links |Id[Link] |Group, Event, |Section |
+ | | |Task, Location, |4.2.7, |
+ | | |Participant |Section |
+ | | | |4.2.5, |
+ | | | |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |locale |String |Group, Event, |Section |
+ | | |Task |4.2.8 |
+ +--------------------+-----------------+----------------+-----------+
+ |localizations |String |Event, Task |Section |
+ | |[PatchObject] | |4.6.1 |
+ +--------------------+-----------------+----------------+-----------+
+ |locationId |Id |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |locations |Id[Location] |Event, Task |Section |
+ | | | |4.2.5 |
+ +--------------------+-----------------+----------------+-----------+
+ |locationTypes |String[Boolean] |Location |Section |
+ | | | |4.2.5 |
+ +--------------------+-----------------+----------------+-----------+
+ |memberOf |Id[Boolean] |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |method |String |Event, Task |Section |
+ | | | |4.1.8 |
+ +--------------------+-----------------+----------------+-----------+
+ |name |String |Location, |Section |
+ | | |VirtualLocation,|4.2.5, |
+ | | |Participant |Section |
+ | | | |4.2.6, |
+ | | | |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |names |String[Boolean] |TimeZoneRule |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |nthOfPeriod |Int |NDay |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |offset |SignedDuration |OffsetTrigger |Section |
+ | | | |4.5.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |offsetFrom |UTCDateTime |TimeZoneRule |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |offsetTo |UTCDateTime |TimeZoneRule |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |participants |Id[Participant] |Event, Task |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |participationComment|String |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |participationStatus |String |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |percentComplete |UnsignedInt |Task, |Section |
+ | | |Participant |5.2.4 |
+ +--------------------+-----------------+----------------+-----------+
+ |priority |Int |Event, Task |Section |
+ | | | |4.4.1 |
+ +--------------------+-----------------+----------------+-----------+
+ |privacy |String |Event, Task |Section |
+ | | | |4.4.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |prodId |String |Event, Task, |Section |
+ | | |Group |4.1.4 |
+ +--------------------+-----------------+----------------+-----------+
+ |progress |String |Task, |Section |
+ | | |Participant |5.2.5 |
+ +--------------------+-----------------+----------------+-----------+
+ |progressUpdated |UTCDateTime |Task, |Section |
+ | | |Participant |5.2.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |recurrenceId |LocalDateTime |Event, Task |Section |
+ | | | |4.3.1 |
+ +--------------------+-----------------+----------------+-----------+
+ |recurrenceIdTimeZone|TimeZoneId|null |Event, Task |Section |
+ | | | |4.3.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |recurrenceOverrides |LocalDateTime |Event, Task, |Section |
+ | |[PatchObject] |TimeZoneRule |4.3.5, |
+ | | | |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |recurrenceRules |RecurrenceRule[] |Event, Task, |Section |
+ | | |TimeZoneRule |4.3.3, |
+ | | | |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |rel |String |Link |Section |
+ | | | |1.4.11 |
+ +--------------------+-----------------+----------------+-----------+
+ |relatedTo |String[Relation] |Event, Task, |Section |
+ | | |Alert |4.1.3, |
+ | | | |Section |
+ | | | |4.5.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |relation |String[Boolean] |Relation |Section |
+ | | | |1.4.10 |
+ +--------------------+-----------------+----------------+-----------+
+ |relativeTo |String |OffsetTrigger, |Section |
+ | | |Location |4.5.2, |
+ | | | |Section |
+ | | | |4.2.5 |
+ +--------------------+-----------------+----------------+-----------+
+ |replyTo |String[String] |Event, Task |Section |
+ | | | |4.4.4 |
+ +--------------------+-----------------+----------------+-----------+
+ |requestStatus |String |Event, Task |Section |
+ | | | |4.4.7 |
+ +--------------------+-----------------+----------------+-----------+
+ |roles |String[Boolean] |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |rscale |String |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |sentBy |String |Event, Task, |Section |
+ | | |Participant |4.4.5, |
+ | | | |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |standard |TimeZoneRule[] |TimeZone |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |start |LocalDateTime |TimeZoneRule |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |scheduleAgent |String |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |scheduleForceSend |Boolean |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |scheduleSequence |UnsignedInt |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |scheduleStatus |String[] |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |scheduleUpdated |UTCDateTime |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |sendTo |String[String] |Participant |Section |
+ | | | |4.4.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |sequence |UnsignedInt |Event, Task |Section |
+ | | | |4.1.7 |
+ +--------------------+-----------------+----------------+-----------+
+ |showWithoutTime |Boolean |Event, Task |Section |
+ | | | |4.2.4 |
+ +--------------------+-----------------+----------------+-----------+
+ |size |UnsignedInt |Link |Section |
+ | | | |1.4.11 |
+ +--------------------+-----------------+----------------+-----------+
+ |skip |String |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |source |String |Group |Section |
+ | | | |5.3.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |start |LocalDateTime |Event, Task |Section |
+ | | | |5.1.1, |
+ | | | |Section |
+ | | | |5.2.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |status |String |Event |Section |
+ | | | |5.1.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |timeZone |TimeZoneId|null |Event, Task, |Section |
+ | | |Location |4.7.1, |
+ | | | |Section |
+ | | | |4.2.5 |
+ +--------------------+-----------------+----------------+-----------+
+ |timeZones |TimeZoneId |Event, Task |Section |
+ | |[TimeZone] | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |title |String |Event, Task, |Section |
+ | | |Group, Link |4.2.1 |
+ +--------------------+-----------------+----------------+-----------+
+ |trigger |OffsetTrigger| |Alert |Section |
+ | |AbsoluteTrigger| | |4.5.2 |
+ | |UnknownTrigger | | |
+ +--------------------+-----------------+----------------+-----------+
+ |tzId |String |TimeZone |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |uid |String |Event, Task, |Section |
+ | | |Group |4.1.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |until |LocalDateTime |RecurrenceRule |Section |
+ | | | |4.3.3 |
+ +--------------------+-----------------+----------------+-----------+
+ |updated |UTCDateTime |Event, Task, |Section |
+ | | |Group |4.1.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |uri |String |VirtualLocation |Section |
+ | | | |4.2.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |url |String |TimeZone |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |useDefaultAlerts |Boolean |Event, Task |Section |
+ | | | |4.5.1 |
+ +--------------------+-----------------+----------------+-----------+
+ |validUntil |UTCDateTime |TimeZone |Section |
+ | | | |4.7.2 |
+ +--------------------+-----------------+----------------+-----------+
+ |virtualLocations |Id |Event, Task |Section |
+ | |[VirtualLocation]| |4.2.6 |
+ +--------------------+-----------------+----------------+-----------+
+ |when |UTCDateTime |AbsoluteTrigger |Section |
+ | | | |4.5.2 |
+ +--------------------+-----------------+----------------+-----------+
+
+ Table 1: Initial Contents of the "JSCalendar Properties" Registry
+
+8.3. Creation of the "JSCalendar Types" Registry
+
+ IANA has created the "JSCalendar Types" registry to avoid name
+ collisions and provide a complete reference for all data types used
+ for JSCalendar property values. The registration process is the same
+ as for the "JSCalendar Properties" registry, as defined in
+ Section 8.2.
+
+8.3.1. "JSCalendar Types" Registry Template
+
+ Type Name: the name of the type
+
+ Reference or Description: a brief description or RFC number and
+ section reference where the Type is specified (may be omitted for
+ "reserved" type names)
+
+ Intended Use: common, reserved, or obsolete
+
+ Change Controller: who may request a change to this entry's
+ definition ("IETF" for RFCs from the IETF stream)
+
+8.3.2. Initial Contents for the "JSCalendar Types" Registry
+
+ The following table lists the initial entries of the JSCalendar Types
+ registry. All properties are for common use. All RFC section
+ references are for this document. The change controller for all
+ these properties is "IETF".
+
+ +=================+==========================+
+ | Type Name | Reference or Description |
+ +=================+==========================+
+ | Alert | Section 4.5.2 |
+ +-----------------+--------------------------+
+ | Boolean | Section 1.3 |
+ +-----------------+--------------------------+
+ | Duration | Section 1.4.6 |
+ +-----------------+--------------------------+
+ | Id | Section 1.4.1 |
+ +-----------------+--------------------------+
+ | Int | Section 1.4.2 |
+ +-----------------+--------------------------+
+ | LocalDateTime | Section 1.4.5 |
+ +-----------------+--------------------------+
+ | Link | Section 1.4.11 |
+ +-----------------+--------------------------+
+ | Location | Section 4.2.5 |
+ +-----------------+--------------------------+
+ | NDay | Section 4.3.3 |
+ +-----------------+--------------------------+
+ | Number | Section 1.3 |
+ +-----------------+--------------------------+
+ | Participant | Section 4.4.6 |
+ +-----------------+--------------------------+
+ | PatchObject | Section 1.4.9 |
+ +-----------------+--------------------------+
+ | RecurrenceRule | Section 4.3.3 |
+ +-----------------+--------------------------+
+ | Relation | Section 1.4.10 |
+ +-----------------+--------------------------+
+ | SignedDuration | Section 1.4.7 |
+ +-----------------+--------------------------+
+ | String | Section 1.3 |
+ +-----------------+--------------------------+
+ | TimeZone | Section 4.7.2 |
+ +-----------------+--------------------------+
+ | TimeZoneId | Section 1.4.8 |
+ +-----------------+--------------------------+
+ | TimeZoneRule | Section 4.7.2 |
+ +-----------------+--------------------------+
+ | UnsignedInt | Section 1.4.3 |
+ +-----------------+--------------------------+
+ | UTCDateTime | Section 1.4.4 |
+ +-----------------+--------------------------+
+ | VirtualLocation | Section 4.2.6 |
+ +-----------------+--------------------------+
+
+ Table 2: Initial Contents of the
+ "JSCalendar Types" Registry
+
+8.4. Creation of the "JSCalendar Enum Values" Registry
+
+ IANA has created the "JSCalendar Enum Values" registry to allow
+ interoperable extension of semantics for properties with enumerable
+ values. Each such property will have a subregistry of allowed
+ values. The registration process for a new enum value or adding a
+ new enumerable property is the same as for the "JSCalendar
+ Properties" registry, as defined in Section 8.2.
+
+8.4.1. "JSCalendar Enum Values" Registry Property Template
+
+ This template is for adding a subregistry for a new enumerable
+ property to the "JSCalendar Enum" registry.
+
+ Property Name: These are the name(s) of the property or properties
+ where these values may be used. This MUST be registered in the
+ "JSCalendar Properties" registry.
+
+ Context: This is the list of allowed object types where the property
+ or properties may appear, as registered in the "JSCalendar
+ Properties" registry. This disambiguates where there may be two
+ distinct properties with the same name in different contexts.
+
+ Change Controller: ("IETF" for properties defined in RFCs from the
+ IETF stream).
+
+ Initial Contents: This is the initial list of defined values for
+ this enum, using the template defined in Section 8.4.2. A
+ subregistry will be created with these values for this property
+ name/context tuple.
+
+8.4.2. "JSCalendar Enum Values" Registry Value Template
+
+ This template is for adding a new enum value to a subregistry in the
+ JSCalendar Enum registry.
+
+ Enum Value: the verbatim value of the enum
+
+ Reference or Description: a brief description or RFC number and
+ section reference for the semantics of this value
+
+8.4.3. Initial Contents for the "JSCalendar Enum Values" Registry
+
+ For each subregistry created in this section, all RFC section
+ references are for this document.
+
+ Property Name: action
+ Context: Alert
+ Change Controller: IETF
+ Initial Contents:
+ +============+==========================+
+ | Enum Value | Reference or Description |
+ +============+==========================+
+ | display | Section 4.5.2 |
+ +------------+--------------------------+
+ | email | Section 4.5.2 |
+ +------------+--------------------------+
+
+ Table 3: JSCalendar Enum Values for
+ action (Context: Alert)
+
+ Property Name: display
+ Context: Link
+ Change Controller: IETF
+ Initial Contents:
+ +============+==========================+
+ | Enum Value | Reference or Description |
+ +============+==========================+
+ | badge | Section 1.4.11 |
+ +------------+--------------------------+
+ | graphic | Section 1.4.11 |
+ +------------+--------------------------+
+ | fullsize | Section 1.4.11 |
+ +------------+--------------------------+
+ | thumbnail | Section 1.4.11 |
+ +------------+--------------------------+
+
+ Table 4: JSCalendar Enum Values for
+ display (Context: Link)
+
+ Property Name: features
+ Context: VirtualLocation
+ Change Controller: IETF
+ Initial Contents:
+ +============+==========================+
+ | Enum Value | Reference or Description |
+ +============+==========================+
+ | audio | Section 4.2.6 |
+ +------------+--------------------------+
+ | chat | Section 4.2.6 |
+ +------------+--------------------------+
+ | feed | Section 4.2.6 |
+ +------------+--------------------------+
+ | moderator | Section 4.2.6 |
+ +------------+--------------------------+
+ | phone | Section 4.2.6 |
+ +------------+--------------------------+
+ | screen | Section 4.2.6 |
+ +------------+--------------------------+
+ | video | Section 4.2.6 |
+ +------------+--------------------------+
+
+ Table 5: JSCalendar Enum Values for
+ features (Context: VirtualLocation)
+
+ Property Name: freeBusyStatus
+ Context: Event, Task
+ Change Controller: IETF
+ Initial Contents:
+ +============+==========================+
+ | Enum Value | Reference or Description |
+ +============+==========================+
+ | free | Section 4.4.2 |
+ +------------+--------------------------+
+ | busy | Section 4.4.2 |
+ +------------+--------------------------+
+
+ Table 6: JSCalendar Enum Values for
+ freeBusyStatus (Context: Event, Task)
+
+ Property Name: kind
+ Context: Participant
+ Change Controller: IETF
+ Initial Contents:
+ +============+==========================+
+ | Enum Value | Reference or Description |
+ +============+==========================+
+ | individual | Section 4.4.6 |
+ +------------+--------------------------+
+ | group | Section 4.4.6 |
+ +------------+--------------------------+
+ | resource | Section 4.4.6 |
+ +------------+--------------------------+
+ | location | Section 4.4.6 |
+ +------------+--------------------------+
+
+ Table 7: JSCalendar Enum Values for
+ kind (Context: Participant)
+
+ Property Name: participationStatus
+ Context: Participant
+ Change Controller: IETF
+ Initial Contents:
+ +==============+==========================+
+ | Enum Value | Reference or Description |
+ +==============+==========================+
+ | needs-action | Section 4.4.6 |
+ +--------------+--------------------------+
+ | accepted | Section 4.4.6 |
+ +--------------+--------------------------+
+ | declined | Section 4.4.6 |
+ +--------------+--------------------------+
+ | tentative | Section 4.4.6 |
+ +--------------+--------------------------+
+ | delegated | Section 4.4.6 |
+ +--------------+--------------------------+
+
+ Table 8: JSCalendar Enum Values for
+ participationStatus (Context:
+ Participant)
+
+ Property Name: privacy
+ Context: Event, Task
+ Change Controller: IETF
+ Initial Contents:
+ +============+==========================+
+ | Enum Value | Reference or Description |
+ +============+==========================+
+ | public | Section 4.4.3 |
+ +------------+--------------------------+
+ | private | Section 4.4.3 |
+ +------------+--------------------------+
+ | secret | Section 4.4.3 |
+ +------------+--------------------------+
+
+ Table 9: JSCalendar Enum Values for
+ privacy (Context: Event, Task)
+
+ Property Name: progress
+ Context: Task, Participant
+ Change Controller: IETF
+ Initial Contents:
+ +==============+==========================+
+ | Enum Value | Reference or Description |
+ +==============+==========================+
+ | needs-action | Section 5.2.5 |
+ +--------------+--------------------------+
+ | in-process | Section 5.2.5 |
+ +--------------+--------------------------+
+ | completed | Section 5.2.5 |
+ +--------------+--------------------------+
+ | failed | Section 5.2.5 |
+ +--------------+--------------------------+
+ | cancelled | Section 5.2.5 |
+ +--------------+--------------------------+
+
+ Table 10: JSCalendar Enum Values for
+ progress (Context: Task, Participant)
+
+ Property Name: relation
+ Context: Relation
+ Change Controller: IETF
+ Initial Contents:
+ +============+==========================+
+ | Enum Value | Reference or Description |
+ +============+==========================+
+ | first | Section 1.4.10 |
+ +------------+--------------------------+
+ | next | Section 1.4.10 |
+ +------------+--------------------------+
+ | child | Section 1.4.10 |
+ +------------+--------------------------+
+ | parent | Section 1.4.10 |
+ +------------+--------------------------+
+
+ Table 11: JSCalendar Enum Values for
+ relation (Context: Relation)
+
+ Property Name: relativeTo
+ Context: OffsetTrigger, Location
+ Change Controller: IETF
+ Initial Contents:
+ +============+==========================+
+ | Enum Value | Reference or Description |
+ +============+==========================+
+ | start | Section 4.5.2 |
+ +------------+--------------------------+
+ | end | Section 4.5.2 |
+ +------------+--------------------------+
+
+ Table 12: JSCalendar Enum Values for
+ relativeTo (Context: OffsetTrigger,
+ Location)
+
+ Property Name: roles
+ Context: Participant
+ Change Controller: IETF
+ Initial Contents:
+ +===============+==========================+
+ | Enum Value | Reference or Description |
+ +===============+==========================+
+ | owner | Section 4.4.6 |
+ +---------------+--------------------------+
+ | attendee | Section 4.4.6 |
+ +---------------+--------------------------+
+ | optional | Section 4.4.6 |
+ +---------------+--------------------------+
+ | informational | Section 4.4.6 |
+ +---------------+--------------------------+
+ | chair | Section 4.4.6 |
+ +---------------+--------------------------+
+ | contact | Section 4.4.6 |
+ +---------------+--------------------------+
+
+ Table 13: JSCalendar Enum Values for
+ roles (Context: Participant)
+
+ Property Name: scheduleAgent
+ Context: Participant
+ Change Controller: IETF
+ Initial Contents:
+ +============+==========================+
+ | Enum Value | Reference or Description |
+ +============+==========================+
+ | server | Section 4.4.6 |
+ +------------+--------------------------+
+ | client | Section 4.4.6 |
+ +------------+--------------------------+
+ | none | Section 4.4.6 |
+ +------------+--------------------------+
+
+ Table 14: JSCalendar Enum Values for
+ scheduleAgent (Context: Participant)
+
+ Property Name: status
+ Context: Event
+ Change Controller: IETF
+ Initial Contents:
+ +============+==========================+
+ | Enum Value | Reference or Description |
+ +============+==========================+
+ | confirmed | Section 5.1.3 |
+ +------------+--------------------------+
+ | cancelled | Section 5.1.3 |
+ +------------+--------------------------+
+ | tentative | Section 5.1.3 |
+ +------------+--------------------------+
+
+ Table 15: JSCalendar Enum Values for
+ status (Context: Event)
+
+9. References
+
+9.1. Normative References
+
+ [CLDR] "Unicode Common Locale Data Repository",
+ <http://cldr.unicode.org/>.
+
+ [COLORS] Çelik, T., Lilley, C., and L. Baron, "CSS Color Module
+ Level 3", W3C Recommendation, June 2018,
+ <https://www.w3.org/TR/css-color-3/>.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119,
+ DOI 10.17487/RFC2119, March 1997,
+ <https://www.rfc-editor.org/info/rfc2119>.
+
+ [RFC2392] Levinson, E., "Content-ID and Message-ID Uniform Resource
+ Locators", RFC 2392, DOI 10.17487/RFC2392, August 1998,
+ <https://www.rfc-editor.org/info/rfc2392>.
+
+ [RFC2397] Masinter, L., "The "data" URL scheme", RFC 2397,
+ DOI 10.17487/RFC2397, August 1998,
+ <https://www.rfc-editor.org/info/rfc2397>.
+
+ [RFC3339] Klyne, G. and C. Newman, "Date and Time on the Internet:
+ Timestamps", RFC 3339, DOI 10.17487/RFC3339, July 2002,
+ <https://www.rfc-editor.org/info/rfc3339>.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, DOI 10.17487/RFC3986, January 2005,
+ <https://www.rfc-editor.org/info/rfc3986>.
+
+ [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally
+ Unique IDentifier (UUID) URN Namespace", RFC 4122,
+ DOI 10.17487/RFC4122, July 2005,
+ <https://www.rfc-editor.org/info/rfc4122>.
+
+ [RFC4589] Schulzrinne, H. and H. Tschofenig, "Location Types
+ Registry", RFC 4589, DOI 10.17487/RFC4589, July 2006,
+ <https://www.rfc-editor.org/info/rfc4589>.
+
+ [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data
+ Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006,
+ <https://www.rfc-editor.org/info/rfc4648>.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", STD 68, RFC 5234,
+ DOI 10.17487/RFC5234, January 2008,
+ <https://www.rfc-editor.org/info/rfc5234>.
+
+ [RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322,
+ DOI 10.17487/RFC5322, October 2008,
+ <https://www.rfc-editor.org/info/rfc5322>.
+
+ [RFC5545] Desruisseaux, B., Ed., "Internet Calendaring and
+ Scheduling Core Object Specification (iCalendar)",
+ RFC 5545, DOI 10.17487/RFC5545, September 2009,
+ <https://www.rfc-editor.org/info/rfc5545>.
+
+ [RFC5546] Daboo, C., Ed., "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP)", RFC 5546,
+ DOI 10.17487/RFC5546, December 2009,
+ <https://www.rfc-editor.org/info/rfc5546>.
+
+ [RFC5646] Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying
+ Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646,
+ September 2009, <https://www.rfc-editor.org/info/rfc5646>.
+
+ [RFC5870] Mayrhofer, A. and C. Spanring, "A Uniform Resource
+ Identifier for Geographic Locations ('geo' URI)",
+ RFC 5870, DOI 10.17487/RFC5870, June 2010,
+ <https://www.rfc-editor.org/info/rfc5870>.
+
+ [RFC6047] Melnikov, A., Ed., "iCalendar Message-Based
+ Interoperability Protocol (iMIP)", RFC 6047,
+ DOI 10.17487/RFC6047, December 2010,
+ <https://www.rfc-editor.org/info/rfc6047>.
+
+ [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type
+ Specifications and Registration Procedures", BCP 13,
+ RFC 6838, DOI 10.17487/RFC6838, January 2013,
+ <https://www.rfc-editor.org/info/rfc6838>.
+
+ [RFC6901] Bryan, P., Ed., Zyp, K., and M. Nottingham, Ed.,
+ "JavaScript Object Notation (JSON) Pointer", RFC 6901,
+ DOI 10.17487/RFC6901, April 2013,
+ <https://www.rfc-editor.org/info/rfc6901>.
+
+ [RFC7493] Bray, T., Ed., "The I-JSON Message Format", RFC 7493,
+ DOI 10.17487/RFC7493, March 2015,
+ <https://www.rfc-editor.org/info/rfc7493>.
+
+ [RFC7529] Daboo, C. and G. Yakushev, "Non-Gregorian Recurrence Rules
+ in the Internet Calendaring and Scheduling Core Object
+ Specification (iCalendar)", RFC 7529,
+ DOI 10.17487/RFC7529, May 2015,
+ <https://www.rfc-editor.org/info/rfc7529>.
+
+ [RFC7808] Douglass, M. and C. Daboo, "Time Zone Data Distribution
+ Service", RFC 7808, DOI 10.17487/RFC7808, March 2016,
+ <https://www.rfc-editor.org/info/rfc7808>.
+
+ [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for
+ Writing an IANA Considerations Section in RFCs", BCP 26,
+ RFC 8126, DOI 10.17487/RFC8126, June 2017,
+ <https://www.rfc-editor.org/info/rfc8126>.
+
+ [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
+ 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
+ May 2017, <https://www.rfc-editor.org/info/rfc8174>.
+
+ [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data
+ Interchange Format", STD 90, RFC 8259,
+ DOI 10.17487/RFC8259, December 2017,
+ <https://www.rfc-editor.org/info/rfc8259>.
+
+ [RFC8288] Nottingham, M., "Web Linking", RFC 8288,
+ DOI 10.17487/RFC8288, October 2017,
+ <https://www.rfc-editor.org/info/rfc8288>.
+
+ [TZDB] IANA, "Time Zone Database",
+ <https://www.iana.org/time-zones>.
+
+9.2. Informative References
+
+ [ISO.9070.1991]
+ ISO/IEC, "Information technology -- SGML support
+ facilities -- Registration procedures for public text
+ owner identifiers", Edition 2, ISO/IEC 9070:1991, April
+ 1991, <https://www.iso.org/standard/16645.html>.
+
+ [LINKRELS] IANA, "Link Relations: Link Relation Types",
+ <https://www.iana.org/assignments/link-relations>.
+
+ [LOCATIONTYPES]
+ IANA, "Location Types Registry",
+ <https://www.iana.org/assignments/location-type-registry>.
+
+ [MEDIATYPES]
+ IANA, "Media Types",
+ <https://www.iana.org/assignments/media-types>.
+
+ [RFC6376] Crocker, D., Ed., Hansen, T., Ed., and M. Kucherawy, Ed.,
+ "DomainKeys Identified Mail (DKIM) Signatures", STD 76,
+ RFC 6376, DOI 10.17487/RFC6376, September 2011,
+ <https://www.rfc-editor.org/info/rfc6376>.
+
+ [RFC7265] Kewisch, P., Daboo, C., and M. Douglass, "jCal: The JSON
+ Format for iCalendar", RFC 7265, DOI 10.17487/RFC7265, May
+ 2014, <https://www.rfc-editor.org/info/rfc7265>.
+
+ [RFC7986] Daboo, C., "New Properties for iCalendar", RFC 7986,
+ DOI 10.17487/RFC7986, October 2016,
+ <https://www.rfc-editor.org/info/rfc7986>.
+
+Acknowledgments
+
+ The authors would like to thank the members of CalConnect for their
+ valuable contributions. This specification originated from the work
+ of the API technical committee of CalConnect: The Calendaring and
+ Scheduling Consortium.
+
+Authors' Addresses
+
+ Neil Jenkins
+ Fastmail
+ Collins St. West
+ P.O. Box 234
+ Melbourne VIC 8007
+ Australia
+
+ Email: neilj@fastmailteam.com
+ URI: https://www.fastmail.com
+
+
+ Robert Stepanek
+ Fastmail
+ Collins St. West
+ P.O. Box 234
+ Melbourne VIC 8007
+ Australia
+
+ Email: rsto@fastmailteam.com
+ URI: https://www.fastmail.com