idnits 2.17.1 draft-ietf-calext-jscalendar-icalendar-06.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- No issues found here. Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year == Line 725 has weird spacing: '... x-name verba...' -- The document date (13 January 2022) is 831 days in the past. Is this intentional? Checking references for intended status: Proposed Standard ---------------------------------------------------------------------------- (See RFCs 3967 and 4897 for information about using normative references to lower-maturity documents in RFCs) No issues found here. Summary: 0 errors (**), 0 flaws (~~), 2 warnings (==), 1 comment (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 Calendaring extensions N.M. Jenkins 3 Internet-Draft R. Stepanek 4 Intended status: Standards Track FastMail 5 Expires: 17 July 2022 M. Douglass 6 BCS 7 13 January 2022 9 JSCalendar: Converting from and to iCalendar 10 draft-ietf-calext-jscalendar-icalendar-06 12 Abstract 14 This document provides the required methods for converting JSCalendar 15 from and to iCalendar. 17 Status of This Memo 19 This Internet-Draft is submitted in full conformance with the 20 provisions of BCP 78 and BCP 79. 22 Internet-Drafts are working documents of the Internet Engineering 23 Task Force (IETF). Note that other groups may also distribute 24 working documents as Internet-Drafts. The list of current Internet- 25 Drafts is at https://datatracker.ietf.org/drafts/current/. 27 Internet-Drafts are draft documents valid for a maximum of six months 28 and may be updated, replaced, or obsoleted by other documents at any 29 time. It is inappropriate to use Internet-Drafts as reference 30 material or to cite them other than as "work in progress." 32 This Internet-Draft will expire on 17 July 2022. 34 Copyright Notice 36 Copyright (c) 2022 IETF Trust and the persons identified as the 37 document authors. All rights reserved. 39 This document is subject to BCP 78 and the IETF Trust's Legal 40 Provisions Relating to IETF Documents (https://trustee.ietf.org/ 41 license-info) in effect on the date of publication of this document. 42 Please review these documents carefully, as they describe your rights 43 and restrictions with respect to this document. Code Components 44 extracted from this document must include Revised BSD License text as 45 described in Section 4.e of the Trust Legal Provisions and are 46 provided without warranty as described in the Revised BSD License. 48 Table of Contents 50 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 4 51 1.1. Note (to be deleted later) . . . . . . . . . . . . . . . 4 52 1.2. Motivation . . . . . . . . . . . . . . . . . . . . . . . 4 53 1.3. Scope and caveats . . . . . . . . . . . . . . . . . . . . 4 54 1.4. Notational Conventions . . . . . . . . . . . . . . . . . 5 55 2. iCalendar pre-processing . . . . . . . . . . . . . . . . . . 6 56 3. Translating iCalendar components to JSCalendar . . . . . . . 7 57 3.1. VALARM . . . . . . . . . . . . . . . . . . . . . . . . . 7 58 3.2. VCALENDAR . . . . . . . . . . . . . . . . . . . . . . . . 9 59 3.3. VEVENT . . . . . . . . . . . . . . . . . . . . . . . . . 10 60 3.4. VLOCATION . . . . . . . . . . . . . . . . . . . . . . . . 10 61 3.5. VTIMEZONE, STANDARD, DAYLIGHT . . . . . . . . . . . . . . 11 62 3.6. VTODO . . . . . . . . . . . . . . . . . . . . . . . . . . 12 63 4. Translating iCalendar properties to JSCalendar . . . . . . . 13 64 4.1. ATTACH . . . . . . . . . . . . . . . . . . . . . . . . . 13 65 4.2. ATTENDEE . . . . . . . . . . . . . . . . . . . . . . . . 13 66 4.3. CALSCALE . . . . . . . . . . . . . . . . . . . . . . . . 16 67 4.4. CATEGORIES . . . . . . . . . . . . . . . . . . . . . . . 16 68 4.5. CLASS . . . . . . . . . . . . . . . . . . . . . . . . . . 16 69 4.6. COLOR . . . . . . . . . . . . . . . . . . . . . . . . . . 16 70 4.7. COMMENT . . . . . . . . . . . . . . . . . . . . . . . . . 17 71 4.8. COMPLETED . . . . . . . . . . . . . . . . . . . . . . . . 17 72 4.9. CONCEPT . . . . . . . . . . . . . . . . . . . . . . . . . 17 73 4.10. CONFERENCE . . . . . . . . . . . . . . . . . . . . . . . 18 74 4.11. CONTACT . . . . . . . . . . . . . . . . . . . . . . . . . 18 75 4.12. CREATED . . . . . . . . . . . . . . . . . . . . . . . . . 18 76 4.13. DESCRIPTION . . . . . . . . . . . . . . . . . . . . . . . 19 77 4.14. DTEND, DTSTART, DUE, DURATION . . . . . . . . . . . . . . 20 78 4.15. ESTIMATED-DURATION . . . . . . . . . . . . . . . . . . . 23 79 4.16. EXDATE . . . . . . . . . . . . . . . . . . . . . . . . . 23 80 4.17. EXRULE . . . . . . . . . . . . . . . . . . . . . . . . . 23 81 4.18. DTSTAMP and LAST-MODIFIED . . . . . . . . . . . . . . . . 23 82 4.19. GEO . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 83 4.20. IMAGE . . . . . . . . . . . . . . . . . . . . . . . . . . 24 84 4.21. LOCATION . . . . . . . . . . . . . . . . . . . . . . . . 24 85 4.22. METHOD . . . . . . . . . . . . . . . . . . . . . . . . . 24 86 4.23. ORGANIZER . . . . . . . . . . . . . . . . . . . . . . . . 25 87 4.24. PERCENT-COMPLETE . . . . . . . . . . . . . . . . . . . . 25 88 4.25. PRIORITY . . . . . . . . . . . . . . . . . . . . . . . . 27 89 4.26. PRODID . . . . . . . . . . . . . . . . . . . . . . . . . 28 90 4.27. RECURRENCE-ID . . . . . . . . . . . . . . . . . . . . . . 28 91 4.28. RELATED-TO . . . . . . . . . . . . . . . . . . . . . . . 28 92 4.29. REQUEST-STATUS . . . . . . . . . . . . . . . . . . . . . 29 93 4.30. RESOURCES . . . . . . . . . . . . . . . . . . . . . . . . 29 94 4.31. RDATE . . . . . . . . . . . . . . . . . . . . . . . . . . 30 95 4.32. RRULE . . . . . . . . . . . . . . . . . . . . . . . . . . 30 96 4.33. SEQUENCE . . . . . . . . . . . . . . . . . . . . . . . . 34 97 4.34. STATUS . . . . . . . . . . . . . . . . . . . . . . . . . 34 98 4.35. STRUCTURED-DATA . . . . . . . . . . . . . . . . . . . . . 34 99 4.36. SUMMARY . . . . . . . . . . . . . . . . . . . . . . . . . 35 100 4.37. TRANSP . . . . . . . . . . . . . . . . . . . . . . . . . 35 101 4.38. UID . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 102 4.39. URL . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 103 5. Translating iCalendar Recurrences . . . . . . . . . . . . . . 36 104 5.1. Translating iCalendar Recurrences: Simple objects with 105 overrides . . . . . . . . . . . . . . . . . . . . . . . . 36 106 5.2. Translating iCalendar Recurrences: Overrides with no 107 master . . . . . . . . . . . . . . . . . . . . . . . . . 36 108 6. Translating iCalendar: Further examples . . . . . . . . . . . 36 109 6.1. Recurring event with ATTACH . . . . . . . . . . . . . . . 37 110 6.2. Simple event with CONTACT . . . . . . . . . . . . . . . . 39 111 6.3. Simple event with RESOURCES . . . . . . . . . . . . . . . 40 112 6.4. Recurring event. Attendees only in overrides . . . . . . 40 113 7. Translating JSCalendar objects to iCalendar . . . . . . . . . 43 114 7.1. Event . . . . . . . . . . . . . . . . . . . . . . . . . . 43 115 7.2. Group . . . . . . . . . . . . . . . . . . . . . . . . . . 44 116 7.3. Task . . . . . . . . . . . . . . . . . . . . . . . . . . 45 117 8. Translating JSCalendar properties to iCalendar . . . . . . . 46 118 8.1. alerts . . . . . . . . . . . . . . . . . . . . . . . . . 46 119 8.1.1. action . . . . . . . . . . . . . . . . . . . . . . . 46 120 8.1.2. trigger . . . . . . . . . . . . . . . . . . . . . . . 47 121 8.1.3. todo . . . . . . . . . . . . . . . . . . . . . . . . 48 122 8.2. categories . . . . . . . . . . . . . . . . . . . . . . . 48 123 8.3. created . . . . . . . . . . . . . . . . . . . . . . . . . 49 124 8.4. duration . . . . . . . . . . . . . . . . . . . . . . . . 49 125 8.5. estimatedDuration . . . . . . . . . . . . . . . . . . . . 49 126 8.6. keywords . . . . . . . . . . . . . . . . . . . . . . . . 50 127 8.7. locations . . . . . . . . . . . . . . . . . . . . . . . . 50 128 8.7.1. coordinates . . . . . . . . . . . . . . . . . . . . . 51 129 8.7.2. description . . . . . . . . . . . . . . . . . . . . . 51 130 8.7.3. links . . . . . . . . . . . . . . . . . . . . . . . . 51 131 8.7.4. locationTypes . . . . . . . . . . . . . . . . . . . . 51 132 8.7.5. name . . . . . . . . . . . . . . . . . . . . . . . . 51 133 8.7.6. relativeTo . . . . . . . . . . . . . . . . . . . . . 51 134 8.7.7. timeZone . . . . . . . . . . . . . . . . . . . . . . 51 135 8.7.8. uid . . . . . . . . . . . . . . . . . . . . . . . . . 52 136 8.8. participants . . . . . . . . . . . . . . . . . . . . . . 52 137 8.9. timezones . . . . . . . . . . . . . . . . . . . . . . . . 52 138 9. Security Considerations . . . . . . . . . . . . . . . . . . . 53 139 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 53 140 11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 54 141 12. References . . . . . . . . . . . . . . . . . . . . . . . . . 54 142 12.1. Normative References . . . . . . . . . . . . . . . . . . 54 143 12.2. Informative References . . . . . . . . . . . . . . . . . 55 145 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 55 147 1. Introduction 149 1.1. Note (to be deleted later) 151 This is still very much a work in progress. There are 152 implementations of the mapping but there may be changes over the 153 coming weeks. 155 1.2. Motivation 157 The JSCalendar [RFC8984] data format is used to represent calendar 158 data, and is meant as an alternative to the widely deployed iCalendar 159 [RFC5545] data format. 161 While new calendaring services and applications might use JSCalendar 162 as their main data format to exchange calendaring data, they are 163 likely to interoperate with services and clients that just support 164 iCalendar. Similarly, existing calendaring data is stored in 165 iCalendar format in databases and other calendar stores, and 166 providers and users might want to represent this data also in 167 JSCalendar. Lastly, there is a requirement to preserve custom 168 iCalendar properties that have no equivalent in JSCalendar when 169 converting between these formats. 171 To support these use cases, this document provides the required 172 approach when converting JSCalendar data from and to iCalendar. 174 1.3. Scope and caveats 176 JSCalendar and iCalendar have a lot of semantics in common, but they 177 are not interchangeable formats: 179 * JSCalendar contains a richer data model to express calendar 180 information such as event locations and participants. while 181 future iCalendar extensions may allow a direct mapping, for now 182 there may be no representation directly in iCalendar of some 183 properties. These values may have to be extracted from a full 184 copy of the iCalendar format provided as a property in the 185 JSCalendar data. 187 * iCalendar may contain arbitrary, non-standardised data with custom 188 properties/attributes. These will be translated using the same 189 approach as jCal. 191 * iCalendar has some obsolete features that have been removed from 192 JSCalendar due to not being useful and/or supported in the real 193 world (e.g. custom email alerts to send to random people). 194 Translating these may lose some of the original fidelity. 196 * Implementations may use a custom property to store data that could 197 not be mapped directly in either direction in the original or a 198 custom format, however this is not interoperable. 200 * JSCalendar supports fractional seconds in time values whereas 201 iCalendar does not. A subsequent specification will define how 202 fractional seconds can be represented in iCalendar. 204 Accordingly, this document defines a canonical translation between 205 iCalendar and JSCalendar, and implementations MUST follow the 206 approaches specified here when iCalendar data is represented in 207 JSCalendar and vice-versa. 209 This document defines mappings for the following specifications. 211 * Internet Calendaring and Scheduling Core Object Specification 212 (iCalendar) [RFC5545] 214 * iCalendar Transport-Independent Interoperability Protocol (iTIP) 215 [RFC5546] 217 * New Properties for iCalendar [RFC7986] 219 * Event Publishing Extensions to iCalendar [RFC9073] 221 * Support for iCalendar Relationships 222 [draft-ietf-calext-ical-relations] 224 * "VALARM" Extensions for iCalendar [RFC9074] 226 Therefore all of these specifications MUST be implemented to follow 227 this specification. 229 1.4. Notational Conventions 231 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", 232 "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this 233 document are to be interpreted as described in [RFC2119]. 235 2. iCalendar pre-processing 237 iCalendar uses a line-folding mechanism to limit lines of data to a 238 maximum line length (typically 75 octets) to ensure the maximum 239 likelihood of preserving data integrity as it is transported via 240 various means (e.g., email) -- see Section 3.1 of [RFC5545]. 242 iCalendar data uses an "escape" character sequence for text values 243 and property parameter values. See Sections 3.1 and 3.3 of [RFC5545] 244 as well as [RFC6868]. 246 There is a subtle difference in the number representations between 247 JSON and iCalendar. While in iCalendar, a number may have leading 248 zeros, as well as a leading plus sign; this is not the case in JSON. 249 Numbers should be represented in whatever way needed for the 250 underlying format. 252 When converting from iCalendar to JSCalendar: First, iCalendar lines 253 MUST be unfolded. Afterwards, any iCalendar escaping MUST be 254 unescaped. Finally, JSON escaping, as described in Section 7 of 255 [RFC8259], MUST be applied. The reverse order applies when 256 converting from JSCalendar to iCalendar, which is further described 257 in Section ?. 259 iCalendar uses a base64 encoding for binary data. However, it does 260 not restrict the encoding from being applied to non-binary value 261 types. So, the following rules are applied when processing a 262 property with the "ENCODING" property parameter set to "BASE64": 264 * If the property value type is "BINARY", the base64 encoding MUST 265 be preserved. 267 * If the value type is not "BINARY", the "ENCODING" property 268 parameter MUST be removed, and the value MUST be base64 decoded. 270 When base64 encoding is used, it MUST conform to Section 4 of 271 [RFC4648], which is the base64 method used in [RFC5545]. 273 One key difference in the formatting of values used in iCalendar and 274 JSCalendar is that, in JSCalendar, the specification uses date/time 275 values aligned with the extended format of [ISO.8601.2004], which is 276 more commonly used in Internet applications that make use of the JSON 277 format. The sections of this document describing the various date 278 and time formats contain more information on the use of the complete 279 representation, reduced accuracy, or truncated representation. 281 3. Translating iCalendar components to JSCalendar 283 This section is an alphabetic list of [RFC5545] components and how 284 they are mapped to JSCalendar. 286 At present VFREEBUSY and VJOURNAL are not mapped in jscalendar. 288 3.1. VALARM 290 An [RFC5545] VALARM component is mapped to a member of a JSCalendar 291 "alerts" object with a type of "Alert" and a small id. 293 BEGIN: VEVENT 294 ... 295 BEGIN: VALARM 296 ... 297 END: VALARM 298 BEGIN: VALARM 299 ... 300 END: VALARM 301 END: VEVENT 303 maps to 305 { 306 "@type": "Event", 307 ... 308 "alerts": { 309 "1": { 310 "@type": "Alert", 311 ... 312 }, 313 "2": { 314 "@type": "Alert", 315 ... 316 } 317 } 318 } 320 The [RFC5545] VALARM has a number of problems which are not carried 321 over into JSCalendar. Clients tend to choose how, and in some cases 322 when to notify the user. 324 For example, if the user has a smart-watch they may get tapped on the 325 wrist. The method of notification may depend on which device is 326 being used and the context, for example a meeting or driving. 328 Also, many clients are taking into consideration the travel time and 329 notifying the user earlier if it seems necessary. 331 Specifying that a client should send emails to all attendees is both 332 annoying and dangerous. Attendees have their own preferences for how 333 and when they should be notified. 335 Accordingly, the specification only allows for "display" and "email" 336 actions and - other than specifying when - does not allow much else. 337 Clients and/or servers will generally use the associated event or 338 task title as identification. User preferences generally indicate 339 what actions they prefer. 341 An [RFC5545] ACTION property can take the defined values "AUDIO" / 342 "DISPLAY" / "EMAIL" whereas the JSCalendar "action" property only 343 supports "display" and "email". 345 An "AUDIO" alarm SHOULD be mapped to a "display" alert. Any 346 attachment MUST be ignored. 348 The [RFC5545] example VALARMs will be mapped as follows, assuming 349 they are all in the same event: 351 BEGIN:VEVENT 352 ... 353 BEGIN:VALARM 354 TRIGGER;VALUE=DATE-TIME:19970317T133000Z 355 REPEAT:4 356 DURATION:PT15M 357 ACTION:AUDIO 358 ATTACH;FMTTYPE=audio/basic:ftp://example.com/pub/ 359 sounds/bell-01.aud 360 END:VALARM 361 BEGIN:VALARM 362 TRIGGER:-PT30M 363 REPEAT:2 364 DURATION:PT15M 365 ACTION:DISPLAY 366 DESCRIPTION:Breakfast meeting with executive\n 367 team at 8:30 AM EST. 368 END:VALARM 369 BEGIN:VALARM 370 TRIGGER;RELATED=END:-P2D 371 ACTION:EMAIL 372 ATTENDEE:mailto:john_doe@example.com 373 SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING *** 374 DESCRIPTION:A draft agenda needs to be sent out to the attendees 375 to the weekly managers meeting (MGR-LIST). Attached is a 376 pointer the document template for the agenda file. 377 ATTACH;FMTTYPE=application/msword:http://example.com/ 378 templates/agenda.doc 379 END:VALARM 380 END:VEVENT 382 maps to 384 { 385 "@type": "Event", 386 ... 387 "alerts": { 388 "1": { 389 "@type": "Alert", 390 "action": "display", 391 "trigger": { 392 "@type": "AbsoluteTrigger", 393 "when": "19970317T133000Z" 394 } 395 }, 396 "2": { 397 "@type": "Alert", 398 "action": "display", 399 "trigger": { 400 "@type": "OffsetTrigger", 401 "offset": "-PT30M" 402 } 403 } 404 "3": { 405 "@type": "Alert", 406 "action": "email", 407 "trigger": { 408 "@type": "OffsetTrigger", 409 "offset": "-P2D", 410 "relativeTo": "end" 411 } 412 } 413 } 414 } 416 Note that the ATTACH, ATTENDEE, DESCRIPTION, DURATION, REPEAT and 417 SUMMARY properties have been dropped. 419 3.2. VCALENDAR 421 A [RFC5545] VCALENDAR component may be mapped to a JSCalendar object 422 with a type of "Group". 424 BEGIN: VCALENDAR 425 PRODID:-//ABC Corporation//NONSGML My Product//EN 426 ... 427 END: VCALENDAR 429 maps to 431 { 432 "@type": "Group", 433 "prodid": "-//ABC Corporation//NONSGML My Product//EN", 434 ... 435 } 437 Note that a single Event or Task MAY be converted without a 438 surrounding Group if the VCALENDAR component only contains PRODID and 439 CALSCALE properties. In this case the prodid can go in the Event or 440 Task. The CALSCALE property is dropped - there is no equivalence in 441 JSCalendar. 443 3.3. VEVENT 445 A [RFC5545] VEVENT component is mapped to a JSCalendar object with a 446 type of "Event". 448 BEGIN: VEVENT 449 ... 450 END: VEVENT 452 maps to 454 { 455 "@type": "Event", 456 ... 457 } 459 3.4. VLOCATION 461 A [RFC9073] VLOCATION component is mapped to a JSCalendar object with 462 a type of "Location". Any properties within the VLOCATION must be 463 mapped as described below. 465 BEGIN: VEVENT 466 ... 467 BEGIN: VLOCATION 468 ... 469 END: VLOCATION 470 END: VEVENT 472 maps to 474 { 475 "@type": "Event", 476 ... 477 "locations": { 478 "1": { 479 "@type": "Location", 480 ... 481 } 482 } 483 } 485 3.5. VTIMEZONE, STANDARD, DAYLIGHT 487 A [RFC5545] VTIMEZONE component is mapped to a member of a JSCalendar 488 "timezones" object with a type of "TimeZone" and an id which follows 489 the restrictions specified. 491 The STANDARD and DAYLIGHT components map to JSCalendar TimeZoneRule 492 objects as members of the 494 Note that 496 * There is no current approach for defining standalone sets of 497 timezones. 499 * Timezones defined in the IANA timezone database SHOULD NOT be 500 redefined in the object. Only custom timezones will be defined. 502 BEGIN: VTIMEZONE 503 TZID: Example/Somewhere 504 ... 505 END: VTIMEZONE 506 BEGIN: VTIMEZONE 507 TZID: Example/Somewhere-else 508 ... 509 END: VTIMEZONE 510 BEGIN: VEVENT 511 ... 512 END: VEVENT 514 maps to 516 { 517 "@type": "Event", 518 ... 519 "timezones": { 520 "/Example/Somewhere: { 521 "@type": "TimeZone", 522 "tzId": "Example/Somewhere", 523 ... 524 }, 525 "/Example/Somewhere-else": { 526 "@type": "TimeZone", 527 "tzId": "Example/Somewhere-else", 528 ... 529 } 530 } 531 } 533 3.6. VTODO 535 A [RFC5545] VTODO component is mapped to a JSCalendar object with a 536 type of "Task". 538 BEGIN: VTODO 539 ... 540 END: VTODO 542 maps to 544 { 545 "@type": "Task", 546 ... 547 } 549 4. Translating iCalendar properties to JSCalendar 551 This section is an alphabetic list of [RFC5545] and [RFC7986] 552 properties and how they are mapped to JSCalendar. 554 4.1. ATTACH 556 A [RFC5545] ATTACH allows for two types of attachment: 558 * A uri value 560 * A binary value 562 Both map to a JSCalendar "link" object with a "rel" of "enclosure" 563 and the "href" set to the value of the property. 565 If the FMTTYPE parameter is set then add a JSCalendar "contentType" 566 property to the link object. 568 For a binary value use a base64 data uri. 570 For an example of a recurring event with ATTACH see Section 6.1 572 4.2. ATTENDEE 574 An [RFC5545] ATTENDEE maps to the JSCalendar "participant" property 575 with a JSCalendar "role" of "attendee". The value for role should 576 always be set. 578 In the simplest case a JSCalendar "participant" property will be 579 created and added to the JSCalendar "participants" property. 581 The value of the ATTENDEE property is used to add an "imip" method to 582 the JSCalendar "sendTo" property. The value of the entry will be the 583 ATTENDEE property value. 585 For example: 587 ... 588 ATTENDEE:mailto:user01@example.org 589 ... 591 maps to 593 { 594 ... 595 "participants": { 596 "be450b70-9bf7-4f6e-8f65-971ede566ce3": { 597 "@type": "Participant", 598 "sendTo": { 599 "imip": "mailto:user01@example.org" 600 }, 601 ... 602 } 604 The attendee parameters are mapped to JSCalendar "participant" 605 properties as follows: 607 CN: The value of the CN parameter is used to set the JSCalendar 608 "name" property. 610 CUTYPE: This maps on to the JSCalendar "kind" property as follows: 612 INDIVIDUAL "individual" 614 GROUP "group" 616 RESOURCE "resource" 618 ROOM "location" 620 UNKNOWN No value 622 Any other value should be converted to lower case and assigned to 623 the JSCalendar "kind" property. 625 DELEGATED-FROM: Split the value at any commas and add each resulting 626 element to the JSCalendar "delegatedFrom" property 628 DELEGATED-TO: Split the value at any commas and add each resulting 629 element to the JSCalendar "delegatedFrom" property 631 DIR: If non-null look in the participant "links" property for a 632 JSCalendar "link" property with an href with the same value as the 633 DIR parameter. You may need to search the current override and 634 the master. 636 If none is found create a new one with the JSCalendar "href" 637 property set to the value of the DIR parameter and the JSCalendar 638 "rel" property set to "alternate" 640 LANG: set the JSCalendar "language" property to the value of the 641 LANG parameter. 643 MEMBER: If this is set there should be a corresponding ATTENDEE 644 object with a value equal to the value of the member parameter. 645 If not it is appropriate to skip this parameter. 647 If there is a corresponding ATTENDEE then there should be a 648 corresponding JSCalendar "participant" property. This suggests 649 that CUTYPE=GROUP ATTENDEE properties should be processed ahead of 650 the others. 652 Locate the JSCalendar "participant" property for the group. This 653 may be in the current override or in the master. Add the id to 654 the current participants JSCalendar "memberOf" property. 656 PARTSTAT: If the PARTSTAT parameter is set and is not "NEEDS-ACTION" 657 then set the JSCalendar "participationStatus" property to the 658 lower-cased value of the PARTSTAT. 660 ROLE: This is mapped to the JSCalendar "roles" property as follows: 662 CHAIR "attendee" and "chair" 664 REQ-PARTICIPANT "attendee" 666 OPT-PARTICIPANT "attendee" and "optional" 668 NON-PARTICIPANT "informational" 670 Any other value should be converted to lower case and added to the 671 JSCalendar "roles" property. 673 RSVP: If the value of the RSVP parameter is TRUE set the JSCalendar 674 "expectReply" property to "true" otherwise omit it. 676 SCHEDULE-AGENT: If the value is "CLIENT" (ignoring case) set the 677 JSCalendar "scheduleAgent" property to "client" otherwise omit it. 679 SCHEDULE-FORCE-SEND: Set the JSCalendar "scheduleForceSend" property 680 to the lower-cased value of the [RFC6638] SCHEDULE-FORCE-SEND 681 parameter. 683 SCHEDULE-STATUS: Split the value at any commas and add each 684 resulting element to the JSCalendar "scheduleStatus" property. 686 SENT-BY: The value of the SENT-BY parameter is used to set the 687 JSCalendar "invitedBy" property. 689 4.3. CALSCALE 691 A [RFC5545] CALSCALE has no equivalence in JSCalendar. It is 692 ignored. 694 4.4. CATEGORIES 696 These map on to the JSCalendar "keywords" property with each category 697 being the key to an entry. 699 ... 700 CATEGORIES:APPOINTMENT,EDUCATION 701 CATEGORIES:MEETING 702 ... 704 maps to 706 ... 707 "keywords": { 708 "APPOINTMENT": true, 709 "EDUCATION": true, 710 "MEETING": true 711 }, 712 ... 714 4.5. CLASS 716 Maps to the "privacy" property. The iCalendar property value maps to 717 the JSCalendar value as follows: 719 CONFIDENTIAL "secret" 721 PRIVATE "private" 723 PUBLIC "public" 725 iana-token and x-name verbatim copy 727 4.6. COLOR 729 Maps to the "color" property. Copy the verbatim value. 731 4.7. COMMENT 733 There is no direct mapping for this property which may appear 734 multiple times in [RFC5545]. 736 For a scheduling reply it is presumably a message by the participant 737 so the value or values should be used to set the JSCalendar 738 "participantComment" property. 740 4.8. COMPLETED 742 Set the JSCalendar "progress" property to "completed" and the 743 "progressUpdated" property to the reformatted date/time. 745 ... 746 COMPLETED: "20101010T101010Z" 747 ... 749 maps to 751 ... 752 "progressUpdated": "2010-10-10T10:10:10Z", 753 "progress": "completed", 754 ... 756 4.9. CONCEPT 758 This [draft-ietf-calext-ical-relations] property may appear multiple 759 times in components. 761 Each instance of the property is mapped on to a member of the 762 JSCalendar "categories" property. 764 ... 765 CONCEPT:http://example.com/event-types/arts/music 766 CONCEPT:http://example.com/performance-types/arts/live 767 ... 769 maps to 771 ... 772 "categories": { 773 "http://example.com/event-types/arts/music": true, 774 "http://example.com/performance-types/arts/live": true 775 } 776 ... 778 4.10. CONFERENCE 780 Maps to a "VirtualLocation" object. The property value maps to the 781 "uri" property of the virtual location. 783 Mapping parameters: 785 FEATURE: Maps to the "features" property of the virtual location. 787 LABEL: Maps to the "name" property of the virtual location. 789 LANGUAGE: No mapping. 791 4.11. CONTACT 793 The CONTACT property is mapped on to a participant object with a 794 "roles" property of "contact" and an "order" property of 1 (one). 795 This defines the participant as a primary contact. 797 Mapping parameters: 799 ALTREP Use the same process as for the ATTENDEE DIR parameter: 800 create a link property with the "rel" property set to "alternate" 801 and the "href" property set to the value of the ALTREP parameter. 802 Then add the link to the participants "links" property. 804 LANG Set the participants "language" property. 806 For an example see Section 6.2 808 4.12. CREATED 810 The CREATED property is mapped on to a "created" property with a json 811 formatted form of the date. Example: 813 BEGIN:VEVENT 814 ... 815 CREATED:19960329T133000Z 816 ... 817 END:VEVENT 819 maps to 821 { 822 "@type": "Event", 823 ... 824 "created": "1996-03-29T13:30"00Z", 825 ... 826 } 828 4.13. DESCRIPTION 830 Copy the value, preprocessed according to Section 2 into the 831 "description" property. 833 Mapping parameters: 835 ALTREP No mapping. 837 LANG Use the "locale" property. 839 Example: 841 BEGIN:VEVENT 842 ... 843 DESCRIPTION:We are having a meeting all this week at 12 pm fo 844 r one hour\, with an additional meeting on the first day 2 h 845 ours long.\nPlease bring your own lunch for the 12 pm meetin 846 gs. 847 ... 848 END:VEVENT 850 maps to 852 { 853 "@type": "Event", 854 ... 855 "description": // Note: comments and string concatenation are not 856 // allowed per the JSON specification and is used here 857 // to avoid long lines. 858 "We are having a meeting all this week at 12 pm for one " + 859 "hour, with an additional meeting on the first day 2 " + 860 "hours long.\nPlease bring your own lunch for the 12 pm " + 861 "meetings.", 862 ... 863 } 865 4.14. DTEND, DTSTART, DUE, DURATION 867 If the DTSTART is a DATE only property then add the JSCalendar 868 showWithoutTime property with the value set to "true". The 869 JSCalendar "start" property is set with zero time values. 871 If the DTSTART has a TZID parameter then set the JSCalendar 872 "timeZone" property to the value of TZID. 874 If the DTSTART has a UTC value then set the JSCalendar "timeZone" 875 property to the value "Etc/UTC". The JSCalendar "start" property is 876 set without any UTC indicator. 878 JSCalendar has no equivalent to DTEND. If the component has a DTEND 879 then calculate a value for "DURATION" from that property and DTSTART 880 and proceed as below. 882 If the DTEND has a TZID parameter with a value that differs from the 883 DTSTART TZID parameter then a "location" object should be created 884 with a "relativeTo" property set to "end" and a "timezone" property 885 set to the value of the "TZID" parameter. 887 Note that a task is not required to have a DTSTART so the JSCalendar 888 "timezone" property needs to be set from the DUE property. 890 Convert a DURATION property to the JSCalendar duration. 892 Example - DTSTART and DTEND in same timezone: 894 BEGIN:VEVENT 895 ... 896 DTSTART;TZID=America/New_York:20170315T150000 897 DTEND;TZID=America/New_York:20170315T160000 899 ... 900 END:VEVENT 902 maps to 904 { 905 "@type": "Event", 906 ... 907 "start": "2017-03-15T15:00:00", 908 "timeZone": "America/New_York", 909 "duration": "PT1H" 910 ... 911 } 913 Example - DTSTART and DTEND in different timezone: 915 BEGIN:VEVENT 916 ... 917 DTSTART;TZID=America/New_York:20170315T150000 918 DTEND;TZID=America/LosAngeles:20170315T190000 920 ... 921 END:VEVENT 923 maps to 925 { 926 "@type": "Event", 927 ... 928 "start": "2017-03-15T15:00:00", 929 "timeZone": "America/New_York", 930 "duration": "PT7H" 931 ... 932 "locations": { 933 "1": { 934 "@type": "location", 935 "relatedTo": "end", 936 "timeZone": "America/Los_Angeles" 937 } 938 } 939 } 941 Example - 3 day event: 943 BEGIN:VEVENT 944 ... 945 DTSTART;VALUE=DATE:20210315 946 DTEND;VALUE=DATE:20210318 948 ... 949 END:VEVENT 951 maps to 953 { 954 "@type": "Event", 955 ... 956 "start": "2017-03-15T00:00:00", 957 "duration": "P3D", 958 "showWithoutTime": true, 959 ... 960 } 962 4.15. ESTIMATED-DURATION 964 Copy the ESTIMATED-DURATION value into the JSCalendar 965 "estimatedDuration" property. 967 For example: 969 ... 970 ESTIMATED-DURATION:PT18H 971 ... 973 maps to 975 ... 976 "estimatedDuration": "PT18H" 977 ... 979 4.16. EXDATE 981 Create a patch object with the recurrence id set from the EXDATE 982 value. Add a single JSCalendar "excluded" property with the value 983 set to true. There MUST NOT be any other properties set - other than 984 "@type". 986 4.17. EXRULE 988 Maps to the "excludedRecurrenceRules" property. Also see 989 Section 4.32. 991 4.18. DTSTAMP and LAST-MODIFIED 993 The mapping depends on whether or not the component is a scheduling 994 entity. 996 Not a scheduling entity: The [RFC5545] DTSTAMP and LAST-MODIFIED 997 properties have essentially the same meaning. If both are present 998 use the value of the latest for the "updated" property. Otherwise 999 set from whichever is present. 1001 Is a scheduling entity: DTSTAMP should be used to set the 1002 "ScheduleUpdated" property in the "participant" object for the 1003 attendee. 1005 If present LAST-MODIFIED should be used to set the "updated" 1006 property - otherwise set it from the DTSTAMP. 1008 4.19. GEO 1010 Maps to a Location object, with only the "coordinates" property set. 1011 Note that the JSCalendar coordinates property value MUST be a valid 1012 "geo" URI, so replace the ";" character in the iCalendar value with 1013 "," and prepend the resulting string with "geo:". 1015 4.20. IMAGE 1017 Maps to a Link object with the iCalendar property value mapped to the 1018 location "href" property, and the "rel" property set to "icon". 1020 For a binary value use a base64 data uri in the "href" property. 1022 Mapping parameters: 1024 ALTREP No mapping. 1026 FMTTYPE Maps to the "contentType" property of the Link object. 1028 DISPLAY Maps to the "display" property of the Link object. The 1029 property values "BADGE", "GRAPHIC", "FULLSIZE" and "THUMBNAIL" map 1030 to their lower-case equivalent in JSCalendar. 1032 4.21. LOCATION 1034 If any [RFC9073] "VLOCATION" components are present, then the 1035 [RFC5545]"LOCATION" property should be ignored. 1037 To map the property create a "locations" property with a single 1038 "location" and set the "description" property to the value of the 1039 [RFC5545]"LOCATION" property. 1041 Mapping parameters: 1043 ALTREP Maps to a Link object in the Location "links" property, with 1044 the "href" property set to the parameter value. 1046 4.22. METHOD 1048 Maps to the "method" property of the JSCalendar object. The 1049 JSCalendar property value is the lowercase equivalent of the 1050 iCalendar property value. 1052 4.23. ORGANIZER 1054 Maps to the "replyTo" property of the JSCalendar object. An 1055 iCalendar property value in the "mailto:" URI scheme, maps to the 1056 "imip" method, any other value maps to the "other" method. 1058 If the iCalendar component also contains an ATTENDEE with the same 1059 calendar user address then map that ATTENDEE as defined in 1060 Section 4.2 and add the "owner" role to the Participant "roles" 1061 property. Otherwise, use the ORGANIZER property to map to a 1062 Participant object. The "roles" property of the Participant MUST 1063 only contain the "owner" role and the "expectReply" property value 1064 MUST be "false". Any iCalendar parameters map as defined for 1065 ATTENDEE. 1067 TBD: SENT-BY parameter. Example. 1069 4.24. PERCENT-COMPLETE 1071 For all methods other than REPLY (or no method), the PERCENT-COMPLETE 1072 applies to the VTODO as a whole. In this case it the value is used 1073 to set the JSCalendar "percentComplete" property in the task object. 1075 BEGIN: VCALENDAR 1076 PRODID:-//ABC Corporation//NONSGML My Product//EN 1077 METHOD:PUBLISH 1078 BEGIN:VTODO 1079 ... 1080 PERCENT-COMPLETE:39 1081 END:VTODO 1082 END: VCALENDAR 1084 maps to 1086 { 1087 "@type": "Task", 1088 "prodid": "-//ABC Corporation//NONSGML My Product//EN", 1089 ... 1090 "percentComplete": 39 1091 } 1093 PERCENT-COMPLETE in a REPLY is used to indicate the level of 1094 completeness of the ATTENDEE. There should only be a single ATTENDEE 1095 in the VTODO object. 1097 As ever recurrences complicate matters. For a non-recurring event or 1098 an override that contains the single participant, set the JSCalendar 1099 "percentComplete" property in the JSCalendar "participant" object 1100 representing the attendee. 1102 BEGIN: VCALENDAR 1103 PRODID:-//ABC Corporation//NONSGML My Product//EN 1104 METHOD:REPLY 1105 BEGIN:VTODO 1106 ... 1107 ATTENDEE:mailto:douglm@example.org 1108 PERCENT-COMPLETE:39 1109 END:VTODO 1110 END: VCALENDAR 1112 maps to 1114 { 1115 "@type": "Task", 1116 "prodid": "-//ABC Corporation//NONSGML My Product//EN", 1117 ... 1118 "participants": { 1119 "be450b70-9bf7-4f6e-8f65-971ede566ce3": { 1120 "@type": "Participant", 1121 "sendTo": { 1122 "imip": "mailto:douglm@example.org" 1123 }, 1124 "percentComplete": 39, 1125 "roles": { 1126 "attendee": true 1127 } 1128 }, 1129 ... 1130 } 1132 In the case of an override with the participant appearing in the 1133 master then add a patch to the override. 1135 BEGIN: VCALENDAR 1136 PRODID:-//ABC Corporation//NONSGML My Product//EN 1137 METHOD:REPLY 1138 BEGIN:VTODO 1139 ... 1140 ATTENDEE:mailto:douglm@example.org 1141 END:VTODO 1142 BEGIN:VTODO 1143 ... 1144 RECURRENCE-ID:20200523T120000 1145 ... 1146 ATTENDEE:mailto:douglm@example.org 1147 PERCENT-COMPLETE:39 1148 END:VTODO 1149 END: VCALENDAR 1151 maps to 1153 { 1154 "@type": "Task", 1155 "prodid": "-//ABC Corporation//NONSGML My Product//EN", 1156 ... 1157 "participants": { 1158 "be450b70-9bf7-4f6e-8f65-971ede566ce3": { 1159 "@type": "Participant", 1160 "sendTo": { 1161 "imip": "mailto:douglm@example.org" 1162 }, 1163 "roles": { 1164 "attendee": true 1165 } 1166 }, 1167 "recurrenceOverrides": { 1168 "2020-05-23T12:00:00": { 1169 "participants/be4...6ce3/percentComplete": 39 1170 }, 1171 ... 1172 } 1173 } 1175 4.25. PRIORITY 1177 Simply copy value into the JSCalendar "priority" property. 1179 4.26. PRODID 1181 For a vcalendar Group object with multiple Event and/or Task object 1182 the [RFC5545] VCALENDAR PRODID is mapped to a JSCalendar "prodid" 1183 property in the group. 1185 When mapping to a single Event and/or Task object the [RFC5545] 1186 VCALENDAR PRODID is mapped to a JSCalendar "prodid" property in the 1187 group 1189 BEGIN: VCALENDAR 1190 PRODID:-//ABC Corporation//NONSGML My Product//EN 1191 BEGIN:VEVENT 1192 ... 1193 END:VEVENT 1194 END: VCALENDAR 1196 maps to 1198 { 1199 "@type": "Event", 1200 "prodid": "-//ABC Corporation//NONSGML My Product//EN", 1201 ... 1202 } 1204 4.27. RECURRENCE-ID 1206 Refer to Section 5 for information on mapping recurrence ids. 1208 4.28. RELATED-TO 1210 This is mapped to the JSCalendar "relatedTo" property which is a map 1211 of relations with the target UID as the keys. The iCalendar relation 1212 is by default a PARENT relationship. There is no default for 1213 JSCalendar so the relationship must be explicitly specified. 1215 The RELTYPE parameter values map to their lowercase equivalents in 1216 the "relation" property. 1218 Also note that the iCalendar relationship types are not identical. 1219 CHILD and PARENT map to JSCalendar "child" and "parent" but the best 1220 match for iCalendar SIBLING is "next" 1221 ... 1222 RELATED-TO:jsmith.part7.19960817T083000.xyzMail@example.com 1223 RELATED-TO;RELTYPE=SIBLING: 1224 19960401-080045-4000F192713-0052@example.com 1225 ... 1227 maps to 1229 "relatedTo" : { 1230 "jsmith.part7.19960817T083000.xyzMail@example.com" : { 1231 "@type" : "Relation", 1232 "relation" : { 1233 "parent" : true 1234 } 1235 }, 1236 "19960401-080045-4000F192713-0052@example.com" : { 1237 "@type" : "Relation", 1238 "relation" : { 1239 "next" : true 1240 } 1241 }, 1242 }, 1243 { 1244 "@type": "Event", 1245 "prodid": "-//ABC Corporation//NONSGML My Product//EN", 1246 ... 1247 } 1249 4.29. REQUEST-STATUS 1251 Copy the value into the JSCalendar "requestStatus" property. 1253 4.30. RESOURCES 1255 The RESOURCES property value is a comma-separated list of resources. 1256 First split this into the separate resource names and then each 1257 resource is mapped on a participant object with a "kind" property of 1258 "resource" and the "name" property set to the resource name. 1260 Mapping parameters: 1262 ALTREP Use the same process as for the ATTENDEE DIR parameter: 1263 create a link property with the "rel" property set to "alternate" 1264 and the "href" property set to the value of the ALTREP parameter. 1265 Then add the link to the participants "links" property. 1267 LANG Set the participants "language" property. 1269 For an example see Section 6.3 1271 4.31. RDATE 1273 If the RDATE has a RANGE=THISANDFUTURE parameter then the recurrence 1274 MUST be split at this RDATE. 1276 Truncate the original object before this RDATE, create a new master 1277 representing the object and link them by setting the jscalendar 1278 "relatedTo" property in both. 1280 Otherwise create a patch object with the recurrence id set from the 1281 RDATE value. If the instance has overrides the differences will also 1282 be set in the object. 1284 4.32. RRULE 1286 Each RRULE is converted to an object in the JSCalendar 1287 "recurrenceRules" property. Each entry has the type 1288 "RecurrenceRule". 1290 ... 1291 RRULE:... 1292 ... 1294 maps to 1296 ... 1297 "recurrenceRules" : [{ 1298 "@type" : "RecurrenceRule", 1299 ... 1300 }], 1301 ... 1303 The recurrence rule object has one property for each element of the 1304 recurrence rule. The iCalendar rule has to be parsed out and the 1305 individual jscalendar property values set. Most take the same type 1306 but there are exceptions. 1308 FREQ (mandatory) Copy into the jscalendar "frequency" property 1309 converted to lowercase. 1311 INTERVAL If present and not 1 copy into the jscalendar "interval" 1312 property. 1314 RSCALE If present copy into the jscalendar "rscale" property 1315 converted to lowercase. 1317 SKIP If present copy into the jscalendar "skip" property converted 1318 to lowercase. 1320 WKST If present copy into the jscalendar "firstDayOfWeek" property 1321 converted to lowercase. 1323 BYDAY If present each element becomes an entry in the jsCalendar 1324 "byDay" propety. This is an array of NDay objects which may have 1325 2 properties: 1327 day The two character weekday abbreviation. 1329 nthOfPeriod If the weekday abbreviation is preceded by a signed 1330 integer value set the jscalendar "nthOfPeriod" property. 1332 ... 1333 RRULE:...,BYDAY=-1MO 1334 ... 1336 maps to 1338 ... 1339 "recurrenceRules" : [{ 1340 "@type" : "RecurrenceRule", 1341 ... 1342 "byday": [{ 1343 "day": "mo", 1344 "nthOfPeriod": -1 1345 }] 1346 ... 1347 }], 1348 ... 1350 BYMONTHDAY If present each element will be an element in the 1351 jscalendar "byMonthDay" property. 1353 BYMONTH If present each element will be an element in the jscalendar 1354 "byMonth" property. 1356 Note that the iCalendar values are numeric but the JSCalendar 1357 values are strings. This is because of the possible "L" suffix 1358 for leap months. 1360 BYYEARDAY If present each element will be an element in the 1361 jscalendar "byYearDay" property. 1363 BYWEEKNO If present each element will be an element in the 1364 jscalendar "byWeekNo" property. 1366 BYHOUR If present each element will be an element in the jscalendar 1367 "byHour" property. 1369 BYMINUTE If present each element will be an element in the 1370 jscalendar "byMinute" property. 1372 BYSECOND If present each element will be an element in the 1373 jscalendar "bySecond" property. 1375 BYSETPOS If present each element will be an element in the 1376 jscalendar "bySetPosition" property. 1378 COUNT If present set in the jscalendar "count" property. 1380 UNTIL If present set the jscalendar "until" property with the 1381 appropriately reformatted value. If the is no time part append a 1382 0 time and reformat as a jscalendar local date/time. 1384 Some examples: 1386 ... 1387 RRULE:FREQ=DAILY;COUNT=10 1388 ... 1390 maps to 1392 ... 1393 "recurrenceRules" : [{ 1394 "@type" : "RecurrenceRule", 1395 "frequency": "daily", 1396 "count": 10 1397 }], 1398 ... 1400 ... 1401 RRULE:FREQ=YEARLY;UNTIL=20220512T140000Z; 1402 BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA 1403 ... 1405 maps to 1407 ... 1408 "recurrenceRules" : [{ 1409 "@type" : "RecurrenceRule", 1410 "frequency": "yearly", 1411 "byMonth": ["1"], 1412 "byDay": [{ 1413 "day": "su" 1414 }, 1415 } 1416 "day": "mo" 1417 }, 1418 } 1419 "day": "tu" 1420 }, 1421 } 1422 "day": "we" 1423 }, 1424 } 1425 "day": "th" 1426 }, 1427 } 1428 "day": "fr" 1429 }, 1430 } 1431 "day": "sa" 1432 }], 1433 "until": "2022-05-12T10:00:00" 1434 }], 1435 ... 1437 ... 1438 RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO 1439 ... 1441 maps to 1443 ... 1444 "recurrenceRules" : [{ 1445 "@type" : "RecurrenceRule", 1446 "frequency": "monthly", 1447 "byDay": [{ 1448 "day": "mo", 1449 "nthOfPeriod": -2 1450 }], 1451 "count": 6 1452 }], 1453 ... 1455 4.33. SEQUENCE 1457 Copy the value into the JSCalendar "sequence" property. 1459 4.34. STATUS 1461 For a VEVENT copy the lower-cased value into the JSCalendar "status" 1462 property. 1464 For a VTODO copy the lower-cased value into the JSCalendar "progress" 1465 property. 1467 4.35. STRUCTURED-DATA 1469 This property is mapped on to a JSCalendar "link" object with the 1470 value mapped on to the JSCalendar "href" property in a manner 1471 depending on the "STRUCTURED-DATA" "VALUE" parameter: 1473 VALUE=TEXT Copy the value as a [RFC2397] data uri either as plain 1474 text or by encoding as a base64 value. If plain text the value 1475 may need escaping as per [RFC2397]. 1477 VALUE=BINARY Copy the value as a [RFC2397] data uri speifying base64 1478 encoding. 1480 VALUE=URI Copy the value as-is into the href. 1482 The "STRUCTURED-DATA" "SCHEMA" parameter is mapped on to a JSCalendar 1483 "schema" property within the link object. 1485 The "STRUCTURED-DATA" "FMTTYPE" parameter is mapped on to a 1486 JSCalendar "contentType" property within the link object. 1488 For example: 1490 ... 1491 STRUCTURED-DATA;FMTTYPE=application/ld+json; 1492 SCHEMA="https://schema.org/SportsEvent"; 1493 VALUE=TEXT:{\n 1494 "@context": "http://schema.org"\,\n 1495 "@type": "SportsEvent"\,\n 1496 "homeTeam": "Pittsburgh Pirates"\,\n 1497 "awayTeam": "San Francisco Giants"\n 1498 }\n 1499 ... 1501 maps to (with data truncated) 1503 ... 1504 "links": { 1505 "1": { 1506 "@type" : "Link", 1507 "contentType": "application/ld+json", 1508 "schema": "https://schema.org/SportsEvent", 1509 "href": "data:base64;ewogICAgICAgICJAY29udGV4dCI6IC..." 1510 } 1511 } 1512 ... 1514 4.36. SUMMARY 1516 Copy the value into the JSCalendar "title" property. 1518 Mapping parameters: 1520 ALTREP No mapping. 1522 LANG Use the "locale" property. 1524 4.37. TRANSP 1526 If the value of the TRANSP property (ignoring case) is "opaque" set 1527 the JSCalendar "freeBusyStatus" property to the value "busy". 1529 Otherwise set the JSCalendar "freeBusyStatus" property to the value 1530 "free". 1532 4.38. UID 1534 Copy the value into the JSCalendar "uid" property. 1536 4.39. URL 1538 Maps to a Link object in the JSCalendar object's "links" property, 1539 with the URL property value mapped to the Link "href" property. 1541 5. Translating iCalendar Recurrences 1543 5.1. Translating iCalendar Recurrences: Simple objects with overrides 1545 A simple object with overrides will be converted to a jsCalendar 1546 master event with the rules, recurrence dates and exclusion dates 1547 translated appropriately. 1549 Overrides MUST be mapped on to a jsCalendar patch object and added to 1550 the "recurrenceOverrides" property of the master event with the key 1551 being the value of the iCalendar RECURRENCE-ID translated to a json 1552 format. 1554 Any override property with the same value as the master SHOULD be 1555 ommitted. Remaining properties MAY be added in full. Where 1556 appropriate, differences SHOULD be expressed as a patch. 1558 This can result in a significant reduction in size for objects with 1559 small changes to overrides, for example changing the participation 1560 status of an attendee. 1562 5.2. Translating iCalendar Recurrences: Overrides with no master 1564 When inviting an attendee to a single instance of a recurring event, 1565 only that override should be sent to the attendee. In this case the 1566 override should be a complete jsCalendar object with the type set to 1567 the type of the master. 1569 Additionally, there MUST be a recurrenceId property set to the value 1570 of the recurrence id for that override. If the timezone of the start 1571 of the instance is different from the master value, then there must 1572 also be a "recurrenceIdTimeZone" property set to the start timezone 1573 of the master. 1575 6. Translating iCalendar: Further examples 1577 This section provides more complete examples of translating from 1578 [RFC5545] to JSCalendar. 1580 As usual note that json string values may be split because of line 1581 width limits. This is not legal json. 1583 6.1. Recurring event with ATTACH 1585 This is an example of a recurring event with overrides. The first 1586 override removes an ATTACH property and adds an ATTACH property. The 1587 second override removes all ATTACH properties. 1589 BEGIN:VCALENDAR 1590 CALSCALE:GREGORIAN 1591 PRODID:-//example.org//EN 1592 VERSION:2.0 1593 BEGIN:VEVENT 1594 DTSTAMP:20200522T142047Z 1595 DTSTART;TZID=America/New_York:20200522T120000 1596 DURATION:PT1H 1597 RRULE:FREQ=DAILY;COUNT=8 1598 SUMMARY:recurring daily 8 times 1599 UID:6252D6C40A8308BFE25BBDErecur-1 1600 ATTACH;FMTTYPE=text/plain:http://example.org/doc1.txt 1601 ATTACH;FMTTYPE=text/plain:http://example.org/doc2.txt 1602 ATTACH;FMTTYPE=text/plain:http://example.org/doc3.txt 1603 END:VEVENT 1604 BEGIN:VEVENT 1605 DTSTAMP:20200522T142047Z 1606 DTSTART;TZID=America/New_York:20200523T120000 1607 DURATION:PT1H 1608 RECURRENCE-ID;TZID=America/New_York:20200523T120000 1609 SUMMARY:recurring daily 8 times 1610 UID:6252D6C40A8308BFE25BBDErecur-1 1611 ATTACH;FMTTYPE=text/plain:http://example.org/doc2.txt 1612 ATTACH;FMTTYPE=text/plain:http://example.org/doc3.txt 1613 ATTACH;FMTTYPE=text/plain:http://example.org/doc4.txt 1614 END:VEVENT 1615 BEGIN:VEVENT 1616 DTSTAMP:20200522T142047Z 1617 DTSTART;TZID=America/New_York:20200524T120000 1618 DURATION:PT1H 1619 RECURRENCE-ID;TZID=America/New_York:20200524T120000 1620 SUMMARY:recurring daily 8 times 1621 UID:6252D6C40A8308BFE25BBDErecur-1 1622 END:VEVENT 1623 END:VCALENDAR 1625 maps to 1627 { 1628 "prodId": "//example.org//EN", 1629 "entries": [ 1630 { 1631 "links": { 1632 "1": { 1633 "@type": "Link", 1634 "rel": "enclosure", 1635 "contentType": "text/plain", 1636 "href": "http://example.org/doc1.txt" 1637 }, 1638 "2": { 1639 "@type": "Link", 1640 "rel": "enclosure", 1641 "contentType": "text/plain", 1642 "href": "http://example.org/doc2.txt" 1643 }, 1644 "3": { 1645 "@type": "Link", 1646 "rel": "enclosure", 1647 "contentType": "text/plain", 1648 "href": "http://example.org/doc3.txt" 1649 } 1650 }, 1651 "created ": "2020-05-23T17:04:50Z", 1652 "start": "2020-05-22T12:00:00", 1653 "timeZone": "America/New_York", 1654 "duration": "PT1H", 1655 "title": "recurring daily 8 times", 1656 "uid": "6252D6C40A8308BFE25BBDErecur-1", 1657 "recurrenceRules": [ 1658 { 1659 "@type": "RecurrenceRule", 1660 "frequency": "daily", 1661 "count": 8 1662 } 1663 ], 1664 "recurrenceOverrides": { 1665 "2020-05-23T12:00:00": { 1666 "recurrenceId": "2020-05-23T12:00:00", 1667 "links/d4a618d4-929c-4c81-ae5b-322afe407a00": null, 1668 "links/fb75b76a-a159-4a86-bd3d-7ace6b39c6c3": { 1669 "@type": "Link", 1670 "rel": "enclosure", 1671 "contentType": "text/plain", 1672 "href": "http://example.org/doc4.txt" 1673 } 1674 }, 1675 "2020-05-24T12:00:00": { 1676 "recurrenceId": "2020-05-24T12:00:00", 1677 "links/d4a618d4-929c-4c81-ae5b-322afe407a00": null, 1678 "links/6c54e72e-3413-487c-ae14-fb318a90db43": null, 1679 "links/44087e9a-132c-4a5d-b25d-4ce580edb004": null 1680 } 1681 } 1682 } 1683 ] 1684 } 1686 6.2. Simple event with CONTACT 1688 This example shows the conversion of a simple event with a single 1689 CONTACT property in JSCalendar. 1691 BEGIN:VCALENDAR 1692 CALSCALE:GREGORIAN 1693 PRODID:-//Example//EN 1694 VERSION:2.0 1695 BEGIN:VEVENT 1696 DTSTAMP:20200522T142047Z 1697 DTSTART;TZID=America/New_York:20200622T120000 1698 DURATION:PT1H 1699 SUMMARY:event with contact 1700 UID:6252D6C40A8308BFE25BBEFcontact-1 1701 CONTACT;ALTREP="ldap://example.com:6666/o=ABC%20Industries\, 1702 c=US???(cn=Jim%20Dolittle)":Jim Dolittle\, ABC Industries\, 1703 +1-919-555-1234 1704 END:VEVENT 1705 END:VCALENDAR 1707 translates to 1709 { 1710 "@type": "Group", 1711 "prodId": "//Example.org//Example V3.13.2//EN", 1712 "entries": [ 1713 { 1714 "@type": "Event", 1715 "participants": { 1716 "40288108-733187c1-0173-3188007b-00000001": { 1717 "@type": "Participant", 1718 "roles": { 1719 "contact": true 1720 }, 1721 "description": "Jim Dolittle, ABC Industries,\ 1722 +1-919-555-1234", 1723 "links": { 1724 "1": { 1725 "@type": "Link", 1726 "href": "ldap://example.com:6666/o=ABC%20Industries,\ 1727 c=US???(cn=Jim%20Dolittle)", 1728 "rel": "alternate" 1729 } 1730 } 1731 } 1732 }, 1733 "created ": "2020-07-09T03:04:23Z", 1734 "start": "2020-06-22T12:00:00", 1735 "timeZone": "America/New_York", 1736 "duration": "PT1H", 1737 "title": "event with contact", 1738 "uid": "6252D6C40A8308BFE25BBEFcontact-1" 1739 } 1740 ] 1741 } 1743 6.3. Simple event with RESOURCES 1745 TBD 1747 6.4. Recurring event. Attendees only in overrides 1749 In this more complex example there is no ORGANIZER or ATTENDEEs in 1750 the master event. There are overrides which invite one or more 1751 attendees. 1753 For one overrride the ORGANIZER is also an ATTENDEE. In the other 1754 that is not the case. This is reflected in the "roles" property for 1755 the organizer. 1757 Note that each override has its own "participants" property and the 1758 first has a links property to handle the DIR parameter on one 1759 attendee. 1761 BEGIN:VCALENDAR 1762 PRODID://Example.org//Example V3.13.2//EN 1763 VERSION:2.0 1764 BEGIN:VEVENT 1765 CREATED:20200704T035515Z 1766 DURATION:PT1H 1767 DTSTAMP:20200704T035706Z 1768 DTSTART;TZID=America/New_York:20200522T120000 1769 LAST-MODIFIED:20200704T035706Z 1770 SUMMARY:recurring daily 8 times 1771 UID:6252D6C40A8308BFE25BBEFrecur1-1 1772 RRULE:FREQ=DAILY;COUNT=8 1773 END:VEVENT 1774 BEGIN:VEVENT 1775 RECURRENCE-ID;TZID=America/New_York:20200523T120000 1776 ATTENDEE:mailto:douglm@example.org 1777 ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=1.2;DIR="http://example.org/ 1778 vcards/vbede.vcf":mailto:vbede@example.org 1779 CREATED:20200704T035515Z 1780 DURATION:PT1H 1781 DTSTAMP:20200704T035706Z 1782 DTSTART;TZID=America/New_York:20200523T120000 1783 LAST-MODIFIED:20200704T035706Z 1784 ORGANIZER:mailto:douglm@example.org 1785 SUMMARY:recurring daily 8 times 1786 UID:6252D6C40A8308BFE25BBEFrecur1-1 1787 END:VEVENT 1788 BEGIN:VEVENT 1789 RECURRENCE-ID;TZID=America/New_York:20200524T120000 1790 ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=1.2:mailto:user01@example.org 1791 ATTENDEE;RSVP=TRUE;SCHEDULE-STATUS=1.2:mailto:vbede@example.org 1792 CREATED:20200704T035515Z 1793 DURATION:PT1H 1794 DTSTAMP:20200704T035706Z 1795 DTSTART;TZID=America/New_York:20200524T120000 1796 LAST-MODIFIED:20200704T035706Z 1797 ORGANIZER:mailto:douglm@example.org 1798 SUMMARY:recurring daily 8 times 1799 UID:6252D6C40A8308BFE25BBEFrecur1-1 1800 END:VEVENT 1801 END:VCALENDAR 1803 translates to 1805 { 1806 "@type": "Group", 1807 "prodId": "//Example.org//Example V3.13.2//EN", 1808 "entries": [ 1809 { 1810 "@type": "Event", 1811 "created ": "2020-07-04T03:57:06Z", 1812 "start": "2020-05-22T12:00:00", 1813 "timeZone": "America/New_York", 1814 "duration": "PT1H", 1815 "title": "recurring daily 8 times", 1816 "uid": "6252D6C40A8308BFE25BBEFrecur1-1", 1817 "recurrenceRules": [ 1818 { 1819 "@type": "RecurrenceRule", 1820 "frequency": "daily", 1821 "count": 8 1822 } 1823 ], 1824 "recurrenceOverrides": { 1825 "2020-05-23T12:00:00": { 1826 "participants": { 1827 "be450b70-9bf7-4f6e-8f65-971ede566ce3": { 1828 "@type": "Participant", 1829 "sendTo": { 1830 "imip": "mailto:douglm@example.org" 1831 }, 1832 "roles": { 1833 "attendee": true, 1834 "owner": true 1835 } 1836 }, 1837 "a539dfe3-4463-4f28-b9de-17d3a0e99faf": { 1838 "@type": "Participant", 1839 "sendTo": { 1840 "imip": "mailto:vbede@example.org" 1841 }, 1842 "expectReply": true, 1843 "links": { 1844 "1": { 1845 "@type": "Link", 1846 "href": "http://example.org/vcards/vbede.vcf", 1847 "rel": "alternate" 1848 } 1849 }, 1850 "roles": { 1851 "attendee": true 1852 }, 1853 "scheduleStatus": "1.2" 1854 } 1855 }, 1856 "replyTo": { 1857 "imip": "mailto:douglm@example.org" 1858 } 1859 }, 1860 "2020-05-24T12:00:00": { 1861 "participants": { 1862 "daeae4cf-6f6a-4ce3-9f4d-6bd884650d3d": { 1863 "@type": "Participant", 1864 "sendTo": { 1865 "imip": "mailto:user01@example.org" 1866 }, 1867 "expectReply": true, 1868 "roles": { 1869 "attendee": true 1870 }, 1871 "scheduleStatus": "1.2" 1872 }, 1873 "a6de6de3-271f-4679-9241-1b3bca6b602d": { 1874 "@type": "Participant", 1875 "sendTo": { 1876 "imip": "mailto:vbede@example.org" 1877 }, 1878 "expectReply": true, 1879 "roles": { 1880 "attendee": true 1881 }, 1882 "scheduleStatus": "1.2" 1883 }, 1884 "aaa8483b-b18b-4dbd-b218-77d8db027d35": { 1885 "@type": "Participant", 1886 "sendTo": { 1887 "imip": "mailto:douglm@example.org" 1888 }, 1889 "roles": { 1890 "owner": true 1891 } 1892 } 1893 }, 1894 "replyTo": { 1895 "imip": "mailto:douglm@example.org" 1896 } 1897 } 1898 } 1899 } 1900 ] 1901 } 1903 7. Translating JSCalendar objects to iCalendar 1905 This section lists the JSCalendar objects that map to [RFC5545] 1906 components. 1908 7.1. Event 1910 A JSCalendar object with a type of "Event" is mapped on to a 1911 [RFC5545] VEVENT component. 1913 If it is a single VEVENT then a [RFC5545] VCALENDAR component must 1914 surround it and the JSCalendar "prodid" property will be converted to 1915 a [RFC5545] PRODID. 1917 { 1918 "@type": "Event", 1919 "prodid": "-//ABC Corporation//NONSGML My Product//EN", 1920 ... 1921 } 1923 maps to 1925 BEGIN: VCALENDAR 1926 PRODID:-//ABC Corporation//NONSGML My Product//EN 1927 BEGIN:VEVENT 1928 ... 1929 END:VEVENT 1930 END: VCALENDAR 1932 When converting multiple Event or Task objects the surrounding 1933 [RFC5545] VCALENDAR object must have a [RFC5545] PRODID set from 1934 either the Group "prodid" or generated. 1936 7.2. Group 1938 A JSCalendar object with a type of "Group" is mapped on to a 1939 [RFC5545] VCALENDAR component. 1941 { 1942 "@type": "Group", 1943 "prodid": "-//ABC Corporation//NONSGML My Product//EN", 1944 ... 1945 { 1946 "@type": "Event", 1947 ... 1948 } 1949 { 1950 "@type": "Event", 1951 ... 1952 } 1953 } 1955 maps to 1957 BEGIN: VCALENDAR 1958 PRODID:-//ABC Corporation//NONSGML My Product//EN 1959 BEGIN:VEVENT 1960 ... 1961 END:VEVENT 1962 BEGIN:VEVENT 1963 ... 1964 END:VEVENT 1965 END: VCALENDAR 1967 7.3. Task 1969 A JSCalendar object with a type of "Task" is mapped on to a [RFC5545] 1970 VTODO component. 1972 If it is a single VTODO then a [RFC5545] VCALENDAR component must 1973 surround it and the JSCalendar "prodid" property will be converted to 1974 a [RFC5545] PRODID. 1976 { 1977 "@type": "Task", 1978 "prodid": "-//ABC Corporation//NONSGML My Product//EN", 1979 ... 1980 } 1982 maps to 1984 BEGIN: VCALENDAR 1985 PRODID:-//ABC Corporation//NONSGML My Product//EN 1986 BEGIN:VTODO 1987 ... 1988 END:VTODO 1989 END: VCALENDAR 1991 When converting multiple Event or Task objects the surrounding 1992 [RFC5545] VCALENDAR object must have a [RFC5545] PRODID set from 1993 either the Group "prodid" or generated. 1995 8. Translating JSCalendar properties to iCalendar 1997 This section is an alphabetic list of all JSCalendar top-level 1998 properties that map to [RFC5545] iCalendar. 2000 8.1. alerts 2002 Each member of a JSCalendar alerts property maps to a [RFC5545] 2003 VALARM component. Only display and email alarms are allowed in 2004 JSCalendar. 2006 8.1.1. action 2008 The JSCalendar "alert" property maps to the [RFC5545] ACTION 2009 property. The value SHOULD be the uppercased version if the 2010 JSCalendar "alert" property. 2012 For example: 2014 ... 2015 "action": "display", 2016 ... 2018 maps to 2020 ACTION:DISPLAY 2022 and 2024 ... 2025 "action": "email", 2026 ... 2028 maps to 2030 ACTION:EMAIL 2032 8.1.2. trigger 2034 A JSCalendar trigger with a type of "AbsoluteTrigger" maps on to a 2035 [RFC5545] TRIGGER property with a "VALUE" parameter of "DATE-TIME" 2036 and a value taken from the JSCalendar "when" property. 2038 For example: 2040 "trigger": { 2041 "@type": "AbsoluteTrigger", 2042 "when": "20210315T133000Z" 2043 } 2045 maps to 2047 TRIGGER;VALUE=DATE-TIME:20210315T133000Z 2049 A JSCalendar trigger with a type of "OffsetTrigger" maps on to a 2050 [RFC5545] TRIGGER property with a duration value taken from the 2051 JSCalendar "offset" property. 2053 If the JSCalendar trigger has a "relativeTo" property with the value 2054 "end" then the [RFC5545] TRIGGER property will have a RELATED=END 2055 parameter. 2057 For example: 2059 "trigger": { 2060 "@type": "OffsetTrigger", 2061 "offset": "-P2D", 2062 "relativeTo": "end" 2063 } 2065 maps to 2067 TRIGGER;RELATED=END:-P2D 2069 and 2071 "trigger": { 2072 "@type": "OffsetTrigger", 2073 "offset": "-PT30M" 2074 } 2076 maps to 2078 TRIGGER:-PT30M 2080 8.1.3. todo 2082 Need to deal with "acknowledged" and "relatedTo". Also in the 2083 icalendar to jscalendar. 2085 8.2. categories 2087 Each member of the JSCalendar "categories" property maps on to a 2088 [RFC9073] CONCEPT property with the value being the key of each 2089 member. 2091 For example: 2093 ... 2094 "categories": { 2095 "http://example.com/event-types/arts/music": true, 2096 "http://example.com/performance-types/arts/live": true 2097 } 2098 ... 2100 maps to 2102 ... 2103 CONCEPT:http://example.com/event-types/arts/music 2104 CONCEPT:http://example.com/performance-types/arts/live 2105 ... 2107 8.3. created 2109 The JSCalendar "created" property maps on to a [RFC5545] CREATED 2110 property with the value being the [RFC5545] UTC date-time derived 2111 from the value of the property. 2113 For example: 2115 ... 2116 "created": "2021-03-15T13:30"00Z" 2117 ... 2119 maps to 2121 ... 2122 CREATED:20210315T133000Z 2123 ... 2125 8.4. duration 2127 The JSCalendar "duration" property is only valid for event objects. 2128 Copy the JSCalendar "duration" property in to the [RFC5545] DURATION 2129 property. 2131 For example: 2133 ... 2134 "duration": "PT1H" 2135 ... 2137 maps to 2139 ... 2140 DURATION:PT1H 2141 ... 2143 8.5. estimatedDuration 2145 The JSCalendar "estimatedDuration" property is only valid for task 2146 objects. Copy the JSCalendar "estimatedDuration" property in to the 2147 [RFC5545] ESTIMATED-DURATION property. 2149 For example: 2151 ... 2152 "estimatedDuration": "PT18H" 2153 ... 2155 maps to 2157 ... 2158 ESTIMATED-DURATION:PT18H 2159 ... 2161 8.6. keywords 2163 Each member of the JSCalendar "categories" property maps on to a 2164 [RFC5545] CATEGORIES property with the value being the key of each 2165 member. 2167 For example: 2169 ... 2170 "keywords": { 2171 "APPOINTMENT": true, 2172 "EDUCATION": true, 2173 "MEETING": true 2174 }, 2175 ... 2177 maps to 2179 ... 2180 CATEGORIES:APPOINTMENT 2181 CATEGORIES:EDUCATION 2182 CATEGORIES:MEETING 2183 ... 2185 or alternatively 2187 ... 2188 CATEGORIES:APPOINTMENT,EDUCATION,MEETING 2189 ... 2191 8.7. locations 2193 JSCalendar locations map to [RFC9073]VLOCATION components. 2195 Additionally, for backwards compatibility, one location should be 2196 mapped on to a [RFC5545] LOCATION property. 2198 8.7.1. coordinates 2200 TODO. Need to decide if to use GEO or define new GEO-URI. 2202 8.7.2. description 2204 The "description" property maps to the DESCRIPTON property value of 2205 the VLOCATION. 2207 8.7.3. links 2209 TODO. First need to define top-level links property mapping. 2211 8.7.4. locationTypes 2213 The keys of the "locationTypes" property map to the LOCATION-TYPE 2214 property value of the VLOCATION. The keys MUST be separated by the 2215 COMMA character (U+002c) and SHOULD sort in ascending alphabetical 2216 order. 2218 8.7.5. name 2220 The "name" property maps to the NAME property value of the VLOCATION. 2222 8.7.6. relativeTo 2224 The "relativeTo" property maps to the RELATED-TO property value of 2225 the VLOCATION. TODO need updated definition of the RELATED-TO draft. 2227 8.7.7. timeZone 2229 The "timeZone" property maps to the TZID property value of the 2230 VLOCATION. 2232 If the TimeZoneId value matches a name from the IANA Time Zone 2233 Database [TZDB] then this value MUST be set in the TZID property. 2235 If the TimeZoneId identifies a custom TimeZone in the JSCalendar 2236 object, then the TZID property value MUST be set to the "tzId" 2237 property value of the custom TimeZone object, and its related 2238 VTIMEZONE added to the VCALENDAR component that encloses the 2239 VLOCATION. 2241 8.7.8. uid 2243 The "uid" property maps to the UID property value of the VLOCATION. 2244 The identifier of the Location object in the enclosing "locations" 2245 property maps to the JMAP-ID property parameter. The parameter MAY 2246 be omitted if the identifier of the Location matches the "uid" value. 2248 8.8. participants 2250 JSCalendar participants will be mapped on to different iCalendar 2251 properties and components depending on their jsCalendar role values. 2253 A participant with a role containing "contact" MUST be mapped on to 2254 an iCalendar CONTACT property and SHOULD also be mapped on to a 2255 [RFC9073]PARTICIPANT component which provides a better mapping. 2257 A participant with a role containing "owner" MUST be mapped on to an 2258 iCalendar ORGANIZER property and SHOULD also be mapped on to a 2259 [RFC9073]PARTICIPANT component which provides a better mapping. 2261 A participant with a role containing any of "attendee", "optional" or 2262 "informational" MUST be mapped on to an iCalendar ATTENDEE property 2263 and SHOULD also be mapped on to a [RFC9073]PARTICIPANT component 2264 which provides a better mapping. 2266 A more complete mapping may be achieved by creating a 2267 [RFC9073]PARTICIPANT component. 2269 For all properties the participants jsCalendar "language" property, 2270 if present, is mapped on to the iCalendar "LANG" property parameter. 2272 For all properties if the participant contains a jsCalendar "link" 2273 with a "rel" of "alternate" then the value of the link is used for 2274 the iCalendar "ALTREP" property parameter. 2276 Where do we get the cua? 2278 8.9. timezones 2280 The JSCalendar TimeZone objects within a "timezones" property are 2281 mapped on to [RFC5545] VTIMEZONE components within the surrounding 2282 VCALENDAR component. Each mapped TimeZone MUST only appear once. 2284 { 2285 "@type": "Event", 2286 ... 2287 "timezones": { 2288 "/Example/Somewhere: { 2289 "@type": "TimeZone", 2290 "tzId": "Example/Somewhere", 2291 ... 2292 }, 2293 "/Example/Somewhere-else": { 2294 "@type": "TimeZone", 2295 "tzId": "Example/Somewhere-else", 2296 ... 2297 } 2298 } 2299 } 2301 maps to 2303 BEGIN: VTIMEZONE 2304 TZID: Example/Somewhere 2305 ... 2306 END: VTIMEZONE 2307 BEGIN: VTIMEZONE 2308 TZID: Example/Somewhere-else 2309 ... 2310 END: VTIMEZONE 2311 BEGIN: VEVENT 2312 ... 2313 END: VEVENT 2315 When converting multiple Event or Task objects the surrounding 2316 [RFC5545] VCALENDAR object must have a [RFC5545] PRODID set from 2317 either the Group "prodid" or generated. 2319 9. Security Considerations 2321 The same security considerations as for [RFC8984] apply. 2323 10. IANA Considerations 2325 None. 2327 11. Acknowledgments 2329 The authors would like to thank the members of CalConnect for their 2330 valuable contributions. This specification originated from the work 2331 of the API technical committee of CalConnect, the Calendaring and 2332 Scheduling Consortium. 2334 12. References 2336 12.1. Normative References 2338 [draft-ietf-calext-ical-relations] 2339 "Support for iCalendar Relationships", 2340 . 2343 [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate 2344 Requirement Levels", BCP 14, RFC 2119, 2345 DOI 10.17487/RFC2119, March 1997, 2346 . 2348 [RFC2397] Masinter, L., "The "data" URL scheme", RFC 2397, 2349 DOI 10.17487/RFC2397, August 1998, 2350 . 2352 [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data 2353 Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, 2354 . 2356 [RFC5545] Desruisseaux, B., Ed., "Internet Calendaring and 2357 Scheduling Core Object Specification (iCalendar)", 2358 RFC 5545, DOI 10.17487/RFC5545, September 2009, 2359 . 2361 [RFC5546] Daboo, C., Ed., "iCalendar Transport-Independent 2362 Interoperability Protocol (iTIP)", RFC 5546, 2363 DOI 10.17487/RFC5546, December 2009, 2364 . 2366 [RFC6638] Daboo, C. and B. Desruisseaux, "Scheduling Extensions to 2367 CalDAV", RFC 6638, DOI 10.17487/RFC6638, June 2012, 2368 . 2370 [RFC6868] Daboo, C., "Parameter Value Encoding in iCalendar and 2371 vCard", RFC 6868, DOI 10.17487/RFC6868, February 2013, 2372 . 2374 [RFC7986] Daboo, C., "New Properties for iCalendar", RFC 7986, 2375 DOI 10.17487/RFC7986, October 2016, 2376 . 2378 [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data 2379 Interchange Format", STD 90, RFC 8259, 2380 DOI 10.17487/RFC8259, December 2017, 2381 . 2383 [RFC8984] Jenkins, N. and R. Stepanek, "JSCalendar: A JSON 2384 Representation of Calendar Data", RFC 8984, 2385 DOI 10.17487/RFC8984, July 2021, 2386 . 2388 [RFC9073] Douglass, M., "Event Publishing Extensions to iCalendar", 2389 RFC 9073, DOI 10.17487/RFC9073, August 2021, 2390 . 2392 [RFC9074] Daboo, C. and K. Murchison, Ed., ""VALARM" Extensions for 2393 iCalendar", RFC 9074, DOI 10.17487/RFC9074, August 2021, 2394 . 2396 12.2. Informative References 2398 [TZDB] IANA, "Time Zone Database", 2399 . 2401 Authors' Addresses 2403 Neil Jenkins 2404 FastMail 2405 PO Box 234 2406 Collins St West 2407 Melbourne VIC 8007 2408 Australia 2410 Email: neilj@fastmailteam.com 2411 URI: https://www.fastmail.com 2413 Robert Stepanek 2414 FastMail 2415 PO Box 234 2416 Collins St West 2417 Melbourne VIC 8007 2418 Australia 2420 Email: rsto@fastmailteam.com 2421 URI: https://www.fastmail.com 2423 Michael Douglass 2424 Bedework Commercial Services 2425 226 3rd Street 2426 Troy, NY 12180 2427 United States of America 2429 Email: mdouglass@bedework.com 2430 URI: http://bedework.com