@rapidmx/activesync 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. package/LICENSE +382 -0
  2. package/README.md +57 -0
  3. package/dist/lib/BaseDeviceSyncStateRoute.js +90 -0
  4. package/dist/lib/BaseDeviceSyncStateRoute.js.map +1 -0
  5. package/dist/lib/BaseEasRoute.js +213 -0
  6. package/dist/lib/BaseEasRoute.js.map +1 -0
  7. package/dist/lib/CompactDateTime.js +43 -0
  8. package/dist/lib/CompactDateTime.js.map +1 -0
  9. package/dist/lib/EasCommandHandler.js +2 -0
  10. package/dist/lib/EasCommandHandler.js.map +1 -0
  11. package/dist/lib/EasSyncKeyUtils.js +119 -0
  12. package/dist/lib/EasSyncKeyUtils.js.map +1 -0
  13. package/dist/lib/adapters/CalendarSyncAdapter.js +255 -0
  14. package/dist/lib/adapters/CalendarSyncAdapter.js.map +1 -0
  15. package/dist/lib/adapters/ContactsSyncAdapter.js +164 -0
  16. package/dist/lib/adapters/ContactsSyncAdapter.js.map +1 -0
  17. package/dist/lib/adapters/EasCollectionSyncAdapter.js +2 -0
  18. package/dist/lib/adapters/EasCollectionSyncAdapter.js.map +1 -0
  19. package/dist/lib/adapters/EmailSyncAdapter.js +230 -0
  20. package/dist/lib/adapters/EmailSyncAdapter.js.map +1 -0
  21. package/dist/lib/adapters/TasksSyncAdapter.js +100 -0
  22. package/dist/lib/adapters/TasksSyncAdapter.js.map +1 -0
  23. package/dist/lib/codec/WbxmlCodePages.js +706 -0
  24. package/dist/lib/codec/WbxmlCodePages.js.map +1 -0
  25. package/dist/lib/codec/WbxmlDecoder.js +154 -0
  26. package/dist/lib/codec/WbxmlDecoder.js.map +1 -0
  27. package/dist/lib/codec/WbxmlElement.js +31 -0
  28. package/dist/lib/codec/WbxmlElement.js.map +1 -0
  29. package/dist/lib/codec/WbxmlEncoder.js +88 -0
  30. package/dist/lib/codec/WbxmlEncoder.js.map +1 -0
  31. package/dist/lib/commands/ComposeMailCommand.js +187 -0
  32. package/dist/lib/commands/ComposeMailCommand.js.map +1 -0
  33. package/dist/lib/commands/FolderSyncCommand.js +150 -0
  34. package/dist/lib/commands/FolderSyncCommand.js.map +1 -0
  35. package/dist/lib/commands/GetItemEstimateCommand.js +149 -0
  36. package/dist/lib/commands/GetItemEstimateCommand.js.map +1 -0
  37. package/dist/lib/commands/ItemOperationsCommand.js +337 -0
  38. package/dist/lib/commands/ItemOperationsCommand.js.map +1 -0
  39. package/dist/lib/commands/MeetingResponseCommand.js +120 -0
  40. package/dist/lib/commands/MeetingResponseCommand.js.map +1 -0
  41. package/dist/lib/commands/MoveItemsCommand.js +103 -0
  42. package/dist/lib/commands/MoveItemsCommand.js.map +1 -0
  43. package/dist/lib/commands/PingCommand.js +145 -0
  44. package/dist/lib/commands/PingCommand.js.map +1 -0
  45. package/dist/lib/commands/ProvisionCommand.js +164 -0
  46. package/dist/lib/commands/ProvisionCommand.js.map +1 -0
  47. package/dist/lib/commands/ResolveRecipientsCommand.js +124 -0
  48. package/dist/lib/commands/ResolveRecipientsCommand.js.map +1 -0
  49. package/dist/lib/commands/SearchCommand.js +137 -0
  50. package/dist/lib/commands/SearchCommand.js.map +1 -0
  51. package/dist/lib/commands/SendMailCommand.js +18 -0
  52. package/dist/lib/commands/SendMailCommand.js.map +1 -0
  53. package/dist/lib/commands/SettingsCommand.js +138 -0
  54. package/dist/lib/commands/SettingsCommand.js.map +1 -0
  55. package/dist/lib/commands/SmartForwardCommand.js +22 -0
  56. package/dist/lib/commands/SmartForwardCommand.js.map +1 -0
  57. package/dist/lib/commands/SmartReplyCommand.js +22 -0
  58. package/dist/lib/commands/SmartReplyCommand.js.map +1 -0
  59. package/dist/lib/commands/SyncCommand.js +406 -0
  60. package/dist/lib/commands/SyncCommand.js.map +1 -0
  61. package/dist/lib/commands/mongo/FolderSyncCommandMongo.js +16 -0
  62. package/dist/lib/commands/mongo/FolderSyncCommandMongo.js.map +1 -0
  63. package/dist/lib/commands/mongo/GetItemEstimateCommandMongo.js +21 -0
  64. package/dist/lib/commands/mongo/GetItemEstimateCommandMongo.js.map +1 -0
  65. package/dist/lib/commands/mongo/ItemOperationsCommandMongo.js +18 -0
  66. package/dist/lib/commands/mongo/ItemOperationsCommandMongo.js.map +1 -0
  67. package/dist/lib/commands/mongo/MeetingResponseCommandMongo.js +17 -0
  68. package/dist/lib/commands/mongo/MeetingResponseCommandMongo.js.map +1 -0
  69. package/dist/lib/commands/mongo/MoveItemsCommandMongo.js +17 -0
  70. package/dist/lib/commands/mongo/MoveItemsCommandMongo.js.map +1 -0
  71. package/dist/lib/commands/mongo/ResolveRecipientsCommandMongo.js +20 -0
  72. package/dist/lib/commands/mongo/ResolveRecipientsCommandMongo.js.map +1 -0
  73. package/dist/lib/commands/mongo/SearchCommandMongo.js +20 -0
  74. package/dist/lib/commands/mongo/SearchCommandMongo.js.map +1 -0
  75. package/dist/lib/commands/mongo/SendMailCommandMongo.js +17 -0
  76. package/dist/lib/commands/mongo/SendMailCommandMongo.js.map +1 -0
  77. package/dist/lib/commands/mongo/SettingsCommandMongo.js +16 -0
  78. package/dist/lib/commands/mongo/SettingsCommandMongo.js.map +1 -0
  79. package/dist/lib/commands/mongo/SmartForwardCommandMongo.js +17 -0
  80. package/dist/lib/commands/mongo/SmartForwardCommandMongo.js.map +1 -0
  81. package/dist/lib/commands/mongo/SmartReplyCommandMongo.js +17 -0
  82. package/dist/lib/commands/mongo/SmartReplyCommandMongo.js.map +1 -0
  83. package/dist/lib/commands/mongo/SyncCommandMongo.js +26 -0
  84. package/dist/lib/commands/mongo/SyncCommandMongo.js.map +1 -0
  85. package/dist/lib/commands/mongo/index.js +14 -0
  86. package/dist/lib/commands/mongo/index.js.map +1 -0
  87. package/dist/lib/commands/sql/FolderSyncCommandSQL.js +16 -0
  88. package/dist/lib/commands/sql/FolderSyncCommandSQL.js.map +1 -0
  89. package/dist/lib/commands/sql/GetItemEstimateCommandSQL.js +21 -0
  90. package/dist/lib/commands/sql/GetItemEstimateCommandSQL.js.map +1 -0
  91. package/dist/lib/commands/sql/ItemOperationsCommandSQL.js +18 -0
  92. package/dist/lib/commands/sql/ItemOperationsCommandSQL.js.map +1 -0
  93. package/dist/lib/commands/sql/MeetingResponseCommandSQL.js +17 -0
  94. package/dist/lib/commands/sql/MeetingResponseCommandSQL.js.map +1 -0
  95. package/dist/lib/commands/sql/MoveItemsCommandSQL.js +17 -0
  96. package/dist/lib/commands/sql/MoveItemsCommandSQL.js.map +1 -0
  97. package/dist/lib/commands/sql/ResolveRecipientsCommandSQL.js +20 -0
  98. package/dist/lib/commands/sql/ResolveRecipientsCommandSQL.js.map +1 -0
  99. package/dist/lib/commands/sql/SearchCommandSQL.js +20 -0
  100. package/dist/lib/commands/sql/SearchCommandSQL.js.map +1 -0
  101. package/dist/lib/commands/sql/SendMailCommandSQL.js +17 -0
  102. package/dist/lib/commands/sql/SendMailCommandSQL.js.map +1 -0
  103. package/dist/lib/commands/sql/SettingsCommandSQL.js +16 -0
  104. package/dist/lib/commands/sql/SettingsCommandSQL.js.map +1 -0
  105. package/dist/lib/commands/sql/SmartForwardCommandSQL.js +17 -0
  106. package/dist/lib/commands/sql/SmartForwardCommandSQL.js.map +1 -0
  107. package/dist/lib/commands/sql/SmartReplyCommandSQL.js +17 -0
  108. package/dist/lib/commands/sql/SmartReplyCommandSQL.js.map +1 -0
  109. package/dist/lib/commands/sql/SyncCommandSQL.js +26 -0
  110. package/dist/lib/commands/sql/SyncCommandSQL.js.map +1 -0
  111. package/dist/lib/commands/sql/index.js +14 -0
  112. package/dist/lib/commands/sql/index.js.map +1 -0
  113. package/dist/lib/index.js +56 -0
  114. package/dist/lib/index.js.map +1 -0
  115. package/dist/lib/mongo/DeviceSyncStateRouteMongo.js +16 -0
  116. package/dist/lib/mongo/DeviceSyncStateRouteMongo.js.map +1 -0
  117. package/dist/lib/mongo/EasRouteMongo.js +51 -0
  118. package/dist/lib/mongo/EasRouteMongo.js.map +1 -0
  119. package/dist/lib/mongo/index.js +8 -0
  120. package/dist/lib/mongo/index.js.map +1 -0
  121. package/dist/lib/mongo.js +6 -0
  122. package/dist/lib/mongo.js.map +1 -0
  123. package/dist/lib/sql/DeviceSyncStateRouteSQL.js +16 -0
  124. package/dist/lib/sql/DeviceSyncStateRouteSQL.js.map +1 -0
  125. package/dist/lib/sql/EasRouteSQL.js +50 -0
  126. package/dist/lib/sql/EasRouteSQL.js.map +1 -0
  127. package/dist/lib/sql/index.js +8 -0
  128. package/dist/lib/sql/index.js.map +1 -0
  129. package/dist/lib/sql.js +6 -0
  130. package/dist/lib/sql.js.map +1 -0
  131. package/dist/types/BaseDeviceSyncStateRoute.d.ts +34 -0
  132. package/dist/types/BaseEasRoute.d.ts +64 -0
  133. package/dist/types/CompactDateTime.d.ts +22 -0
  134. package/dist/types/EasCommandHandler.d.ts +59 -0
  135. package/dist/types/EasSyncKeyUtils.d.ts +89 -0
  136. package/dist/types/adapters/CalendarSyncAdapter.d.ts +52 -0
  137. package/dist/types/adapters/ContactsSyncAdapter.d.ts +33 -0
  138. package/dist/types/adapters/EasCollectionSyncAdapter.d.ts +52 -0
  139. package/dist/types/adapters/EmailSyncAdapter.d.ts +53 -0
  140. package/dist/types/adapters/TasksSyncAdapter.d.ts +32 -0
  141. package/dist/types/codec/WbxmlCodePages.d.ts +45 -0
  142. package/dist/types/codec/WbxmlDecoder.d.ts +33 -0
  143. package/dist/types/codec/WbxmlElement.d.ts +43 -0
  144. package/dist/types/codec/WbxmlEncoder.d.ts +20 -0
  145. package/dist/types/commands/ComposeMailCommand.d.ts +50 -0
  146. package/dist/types/commands/FolderSyncCommand.d.ts +25 -0
  147. package/dist/types/commands/GetItemEstimateCommand.d.ts +43 -0
  148. package/dist/types/commands/ItemOperationsCommand.d.ts +72 -0
  149. package/dist/types/commands/MeetingResponseCommand.d.ts +32 -0
  150. package/dist/types/commands/MoveItemsCommand.d.ts +29 -0
  151. package/dist/types/commands/PingCommand.d.ts +33 -0
  152. package/dist/types/commands/ProvisionCommand.d.ts +54 -0
  153. package/dist/types/commands/ResolveRecipientsCommand.d.ts +34 -0
  154. package/dist/types/commands/SearchCommand.d.ts +39 -0
  155. package/dist/types/commands/SendMailCommand.d.ts +10 -0
  156. package/dist/types/commands/SettingsCommand.d.ts +37 -0
  157. package/dist/types/commands/SmartForwardCommand.d.ts +17 -0
  158. package/dist/types/commands/SmartReplyCommand.d.ts +17 -0
  159. package/dist/types/commands/SyncCommand.d.ts +100 -0
  160. package/dist/types/commands/mongo/FolderSyncCommandMongo.d.ts +8 -0
  161. package/dist/types/commands/mongo/GetItemEstimateCommandMongo.d.ts +7 -0
  162. package/dist/types/commands/mongo/ItemOperationsCommandMongo.d.ts +9 -0
  163. package/dist/types/commands/mongo/MeetingResponseCommandMongo.d.ts +8 -0
  164. package/dist/types/commands/mongo/MoveItemsCommandMongo.d.ts +8 -0
  165. package/dist/types/commands/mongo/ResolveRecipientsCommandMongo.d.ts +8 -0
  166. package/dist/types/commands/mongo/SearchCommandMongo.d.ts +8 -0
  167. package/dist/types/commands/mongo/SendMailCommandMongo.d.ts +8 -0
  168. package/dist/types/commands/mongo/SettingsCommandMongo.d.ts +7 -0
  169. package/dist/types/commands/mongo/SmartForwardCommandMongo.d.ts +8 -0
  170. package/dist/types/commands/mongo/SmartReplyCommandMongo.d.ts +8 -0
  171. package/dist/types/commands/mongo/SyncCommandMongo.d.ts +8 -0
  172. package/dist/types/commands/mongo/index.d.ts +9 -0
  173. package/dist/types/commands/sql/FolderSyncCommandSQL.d.ts +8 -0
  174. package/dist/types/commands/sql/GetItemEstimateCommandSQL.d.ts +7 -0
  175. package/dist/types/commands/sql/ItemOperationsCommandSQL.d.ts +9 -0
  176. package/dist/types/commands/sql/MeetingResponseCommandSQL.d.ts +8 -0
  177. package/dist/types/commands/sql/MoveItemsCommandSQL.d.ts +8 -0
  178. package/dist/types/commands/sql/ResolveRecipientsCommandSQL.d.ts +8 -0
  179. package/dist/types/commands/sql/SearchCommandSQL.d.ts +8 -0
  180. package/dist/types/commands/sql/SendMailCommandSQL.d.ts +8 -0
  181. package/dist/types/commands/sql/SettingsCommandSQL.d.ts +7 -0
  182. package/dist/types/commands/sql/SmartForwardCommandSQL.d.ts +8 -0
  183. package/dist/types/commands/sql/SmartReplyCommandSQL.d.ts +8 -0
  184. package/dist/types/commands/sql/SyncCommandSQL.d.ts +8 -0
  185. package/dist/types/commands/sql/index.d.ts +9 -0
  186. package/dist/types/index.d.ts +51 -0
  187. package/dist/types/mongo/DeviceSyncStateRouteMongo.d.ts +8 -0
  188. package/dist/types/mongo/EasRouteMongo.d.ts +14 -0
  189. package/dist/types/mongo/index.d.ts +3 -0
  190. package/dist/types/mongo.d.ts +1 -0
  191. package/dist/types/sql/DeviceSyncStateRouteSQL.d.ts +8 -0
  192. package/dist/types/sql/EasRouteSQL.d.ts +13 -0
  193. package/dist/types/sql/index.d.ts +3 -0
  194. package/dist/types/sql.d.ts +1 -0
  195. package/package.json +94 -0
@@ -0,0 +1,17 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { FolderSQL, MessageSQL } from "@rapidmx/restapi/sql";
6
+ import { SmartForwardCommand } from "../SmartForwardCommand.js";
7
+ /**
8
+ * @author Jean-Philippe Steinmetz
9
+ */
10
+ export class SmartForwardCommandSQL extends SmartForwardCommand {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.folderClass = FolderSQL;
14
+ this.messageClass = MessageSQL;
15
+ }
16
+ }
17
+ //# sourceMappingURL=SmartForwardCommandSQL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartForwardCommandSQL.js","sourceRoot":"","sources":["../../../../src/commands/sql/SmartForwardCommandSQL.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,mBAAmB;IAA/D;;QACc,gBAAW,GAAQ,SAAS,CAAC;QAC7B,iBAAY,GAAQ,UAAU,CAAC;IAC7C,CAAC;CAAA"}
@@ -0,0 +1,17 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { FolderSQL, MessageSQL } from "@rapidmx/restapi/sql";
6
+ import { SmartReplyCommand } from "../SmartReplyCommand.js";
7
+ /**
8
+ * @author Jean-Philippe Steinmetz
9
+ */
10
+ export class SmartReplyCommandSQL extends SmartReplyCommand {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.folderClass = FolderSQL;
14
+ this.messageClass = MessageSQL;
15
+ }
16
+ }
17
+ //# sourceMappingURL=SmartReplyCommandSQL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SmartReplyCommandSQL.js","sourceRoot":"","sources":["../../../../src/commands/sql/SmartReplyCommandSQL.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,iBAAiB;IAA3D;;QACc,gBAAW,GAAQ,SAAS,CAAC;QAC7B,iBAAY,GAAQ,UAAU,CAAC;IAC7C,CAAC;CAAA"}
@@ -0,0 +1,26 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { MessageSQL, ContactSQL, CalendarEventSQL, TaskSQL, MailboxSQL } from "@rapidmx/restapi/sql";
6
+ import { EmailSyncAdapter } from "../../adapters/EmailSyncAdapter.js";
7
+ import { ContactsSyncAdapter } from "../../adapters/ContactsSyncAdapter.js";
8
+ import { CalendarSyncAdapter } from "../../adapters/CalendarSyncAdapter.js";
9
+ import { TasksSyncAdapter } from "../../adapters/TasksSyncAdapter.js";
10
+ import { SyncCommand } from "../SyncCommand.js";
11
+ /**
12
+ * @author Jean-Philippe Steinmetz
13
+ */
14
+ export class SyncCommandSQL extends SyncCommand {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.mailboxClass = MailboxSQL;
18
+ this.collectionBindings = {
19
+ Email: { entityClass: MessageSQL, adapterClass: EmailSyncAdapter },
20
+ Contacts: { entityClass: ContactSQL, adapterClass: ContactsSyncAdapter },
21
+ Calendar: { entityClass: CalendarEventSQL, adapterClass: CalendarSyncAdapter },
22
+ Tasks: { entityClass: TaskSQL, adapterClass: TasksSyncAdapter },
23
+ };
24
+ }
25
+ }
26
+ //# sourceMappingURL=SyncCommandSQL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SyncCommandSQL.js","sourceRoot":"","sources":["../../../../src/commands/sql/SyncCommandSQL.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,WAAW,EAA8B,MAAM,mBAAmB,CAAC;AAE5E;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,WAAW;IAA/C;;QACc,iBAAY,GAAQ,UAAU,CAAC;QAC/B,uBAAkB,GAA+C;YACvE,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE;YAClE,QAAQ,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,mBAAmB,EAAE;YACxE,QAAQ,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EAAE;YAC9E,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE;SAClE,CAAC;IACN,CAAC;CAAA"}
@@ -0,0 +1,14 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ export * from "./FolderSyncCommandSQL.js";
6
+ export * from "./SyncCommandSQL.js";
7
+ export * from "./SendMailCommandSQL.js";
8
+ export * from "./SmartForwardCommandSQL.js";
9
+ export * from "./SmartReplyCommandSQL.js";
10
+ export * from "./ItemOperationsCommandSQL.js";
11
+ export * from "./SearchCommandSQL.js";
12
+ export * from "./MeetingResponseCommandSQL.js";
13
+ export * from "./SettingsCommandSQL.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/sql/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,56 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * Exchange ActiveSync protocol compatibility (Phase 2 of this library's roadmap): a WBXML codec, JWT-secured
7
+ * transport (`BaseEasRoute`, reusing the framework's existing `@Auth(["jwt"])` strategy - no EAS-specific auth
8
+ * code of its own), and the pragmatic command subset agreed in the architecture plan - `Provision`,
9
+ * `FolderSync`, `Sync` (`Email`/`Contacts`/`Calendar`/`Tasks`), `SendMail`/`SmartForward`/`SmartReply`,
10
+ * `ItemOperations`, `Ping`, `Search` (GAL), `MeetingResponse`, and `Settings`.
11
+ *
12
+ * This module exports only the backend-agnostic surface: the codec, the abstract route/command base classes,
13
+ * the shared sync-cursor/date-format utilities, and the `Sync` collection adapters. The concrete Mongo/SQL
14
+ * classes a deployment actually instantiates (`EasRouteMongo`/`EasRouteSQL` and each command's Mongo/SQL
15
+ * variant) are exported from this package's `./mongo`/`./sql` subpaths instead, alongside every other
16
+ * entity/route/job this library defines - see `MongoConnection`/`ConnectionManager` usage elsewhere in this
17
+ * library's own README for that convention.
18
+ *
19
+ * A deployment mounts EAS at the protocol's well-known path with a trivial one-line subclass, the same pattern
20
+ * `push/MailPushRoute.ts`'s doc comment describes for `BasePushRoute`:
21
+ * ```ts
22
+ * import { EasRouteMongo } from "@rapidrest/mail/mongo";
23
+ * import { RouteDecorators } from "@rapidrest/service-core";
24
+ * const { Route } = RouteDecorators;
25
+ *
26
+ * @Route("/Microsoft-Server-ActiveSync")
27
+ * export class MyEasRoute extends EasRouteMongo {}
28
+ * ```
29
+ */
30
+ export * from "./codec/WbxmlCodePages.js";
31
+ export * from "./codec/WbxmlElement.js";
32
+ export * from "./codec/WbxmlEncoder.js";
33
+ export * from "./codec/WbxmlDecoder.js";
34
+ export * from "./BaseEasRoute.js";
35
+ export * from "./BaseDeviceSyncStateRoute.js";
36
+ export * from "./EasCommandHandler.js";
37
+ export * from "./EasSyncKeyUtils.js";
38
+ export * from "./CompactDateTime.js";
39
+ export * from "./commands/ProvisionCommand.js";
40
+ export * from "./commands/FolderSyncCommand.js";
41
+ export * from "./commands/SyncCommand.js";
42
+ export * from "./commands/ComposeMailCommand.js";
43
+ export * from "./commands/SendMailCommand.js";
44
+ export * from "./commands/SmartForwardCommand.js";
45
+ export * from "./commands/SmartReplyCommand.js";
46
+ export * from "./commands/PingCommand.js";
47
+ export * from "./commands/ItemOperationsCommand.js";
48
+ export * from "./commands/SearchCommand.js";
49
+ export * from "./commands/MeetingResponseCommand.js";
50
+ export * from "./commands/SettingsCommand.js";
51
+ export * from "./adapters/EasCollectionSyncAdapter.js";
52
+ export * from "./adapters/EmailSyncAdapter.js";
53
+ export * from "./adapters/ContactsSyncAdapter.js";
54
+ export * from "./adapters/CalendarSyncAdapter.js";
55
+ export * from "./adapters/TasksSyncAdapter.js";
56
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wCAAwC,CAAC;AACvD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC"}
@@ -0,0 +1,16 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { DeviceSyncStateMongo } from "@rapidmx/restapi/mongo";
6
+ import { BaseDeviceSyncStateRoute } from "../BaseDeviceSyncStateRoute.js";
7
+ /**
8
+ * @author Jean-Philippe Steinmetz
9
+ */
10
+ export class DeviceSyncStateRouteMongo extends BaseDeviceSyncStateRoute {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.deviceSyncStateClass = DeviceSyncStateMongo;
14
+ }
15
+ }
16
+ //# sourceMappingURL=DeviceSyncStateRouteMongo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceSyncStateRouteMongo.js","sourceRoot":"","sources":["../../../src/mongo/DeviceSyncStateRouteMongo.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E;;GAEG;AACH,MAAM,OAAO,yBAA0B,SAAQ,wBAA8C;IAA7F;;QACc,yBAAoB,GAAQ,oBAAoB,CAAC;IAC/D,CAAC;CAAA"}
@@ -0,0 +1,51 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { DeviceSyncStateMongo, MailboxMongo } from "@rapidmx/restapi/mongo";
6
+ import { BaseEasRoute } from "../BaseEasRoute.js";
7
+ import { ProvisionCommand } from "../commands/ProvisionCommand.js";
8
+ import { PingCommand } from "../commands/PingCommand.js";
9
+ import { FolderSyncCommandMongo } from "../commands/mongo/FolderSyncCommandMongo.js";
10
+ import { SyncCommandMongo } from "../commands/mongo/SyncCommandMongo.js";
11
+ import { SendMailCommandMongo } from "../commands/mongo/SendMailCommandMongo.js";
12
+ import { SmartForwardCommandMongo } from "../commands/mongo/SmartForwardCommandMongo.js";
13
+ import { SmartReplyCommandMongo } from "../commands/mongo/SmartReplyCommandMongo.js";
14
+ import { ItemOperationsCommandMongo } from "../commands/mongo/ItemOperationsCommandMongo.js";
15
+ import { SearchCommandMongo } from "../commands/mongo/SearchCommandMongo.js";
16
+ import { MeetingResponseCommandMongo } from "../commands/mongo/MeetingResponseCommandMongo.js";
17
+ import { SettingsCommandMongo } from "../commands/mongo/SettingsCommandMongo.js";
18
+ import { GetItemEstimateCommandMongo } from "../commands/mongo/GetItemEstimateCommandMongo.js";
19
+ import { MoveItemsCommandMongo } from "../commands/mongo/MoveItemsCommandMongo.js";
20
+ import { ResolveRecipientsCommandMongo } from "../commands/mongo/ResolveRecipientsCommandMongo.js";
21
+ /**
22
+ * Mongo-backed concrete `BaseEasRoute`. A deployment mounts this at the well-known EAS path via its own
23
+ * trivial `@Route("/Microsoft-Server-ActiveSync")` subclass, following the same pattern
24
+ * `push/MailPushRoute.ts`'s doc comment describes for `BasePushRoute`.
25
+ *
26
+ * @author Jean-Philippe Steinmetz
27
+ */
28
+ export class EasRouteMongo extends BaseEasRoute {
29
+ constructor() {
30
+ super(...arguments);
31
+ this.deviceSyncStateClass = DeviceSyncStateMongo;
32
+ this.mailboxClass = MailboxMongo;
33
+ this.commandHandlerClasses = [
34
+ ProvisionCommand,
35
+ FolderSyncCommandMongo,
36
+ SyncCommandMongo,
37
+ SendMailCommandMongo,
38
+ SmartForwardCommandMongo,
39
+ SmartReplyCommandMongo,
40
+ ItemOperationsCommandMongo,
41
+ SearchCommandMongo,
42
+ MeetingResponseCommandMongo,
43
+ SettingsCommandMongo,
44
+ PingCommand,
45
+ GetItemEstimateCommandMongo,
46
+ MoveItemsCommandMongo,
47
+ ResolveRecipientsCommandMongo,
48
+ ];
49
+ }
50
+ }
51
+ //# sourceMappingURL=EasRouteMongo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EasRouteMongo.js","sourceRoot":"","sources":["../../../src/mongo/EasRouteMongo.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG;;;;;;GAMG;AACH,MAAM,OAAO,aAAc,SAAQ,YAAgD;IAAnF;;QACc,yBAAoB,GAAQ,oBAAoB,CAAC;QACjD,iBAAY,GAAQ,YAAY,CAAC;QACjC,0BAAqB,GAAU;YACrC,gBAAgB;YAChB,sBAAsB;YACtB,gBAAgB;YAChB,oBAAoB;YACpB,wBAAwB;YACxB,sBAAsB;YACtB,0BAA0B;YAC1B,kBAAkB;YAClB,2BAA2B;YAC3B,oBAAoB;YACpB,WAAW;YACX,2BAA2B;YAC3B,qBAAqB;YACrB,6BAA6B;SAChC,CAAC;IACN,CAAC;CAAA"}
@@ -0,0 +1,8 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ export * from "./EasRouteMongo.js";
6
+ export * from "./DeviceSyncStateRouteMongo.js";
7
+ export * from "../commands/mongo/index.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mongo/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,6 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ export * from "./mongo/index.js";
6
+ //# sourceMappingURL=mongo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo.js","sourceRoot":"","sources":["../../src/mongo.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,16 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { DeviceSyncStateSQL } from "@rapidmx/restapi/sql";
6
+ import { BaseDeviceSyncStateRoute } from "../BaseDeviceSyncStateRoute.js";
7
+ /**
8
+ * @author Jean-Philippe Steinmetz
9
+ */
10
+ export class DeviceSyncStateRouteSQL extends BaseDeviceSyncStateRoute {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.deviceSyncStateClass = DeviceSyncStateSQL;
14
+ }
15
+ }
16
+ //# sourceMappingURL=DeviceSyncStateRouteSQL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceSyncStateRouteSQL.js","sourceRoot":"","sources":["../../../src/sql/DeviceSyncStateRouteSQL.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E;;GAEG;AACH,MAAM,OAAO,uBAAwB,SAAQ,wBAA4C;IAAzF;;QACc,yBAAoB,GAAQ,kBAAkB,CAAC;IAC7D,CAAC;CAAA"}
@@ -0,0 +1,50 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { DeviceSyncStateSQL, MailboxSQL } from "@rapidmx/restapi/sql";
6
+ import { BaseEasRoute } from "../BaseEasRoute.js";
7
+ import { ProvisionCommand } from "../commands/ProvisionCommand.js";
8
+ import { PingCommand } from "../commands/PingCommand.js";
9
+ import { FolderSyncCommandSQL } from "../commands/sql/FolderSyncCommandSQL.js";
10
+ import { SyncCommandSQL } from "../commands/sql/SyncCommandSQL.js";
11
+ import { SendMailCommandSQL } from "../commands/sql/SendMailCommandSQL.js";
12
+ import { SmartForwardCommandSQL } from "../commands/sql/SmartForwardCommandSQL.js";
13
+ import { SmartReplyCommandSQL } from "../commands/sql/SmartReplyCommandSQL.js";
14
+ import { ItemOperationsCommandSQL } from "../commands/sql/ItemOperationsCommandSQL.js";
15
+ import { SearchCommandSQL } from "../commands/sql/SearchCommandSQL.js";
16
+ import { MeetingResponseCommandSQL } from "../commands/sql/MeetingResponseCommandSQL.js";
17
+ import { SettingsCommandSQL } from "../commands/sql/SettingsCommandSQL.js";
18
+ import { GetItemEstimateCommandSQL } from "../commands/sql/GetItemEstimateCommandSQL.js";
19
+ import { MoveItemsCommandSQL } from "../commands/sql/MoveItemsCommandSQL.js";
20
+ import { ResolveRecipientsCommandSQL } from "../commands/sql/ResolveRecipientsCommandSQL.js";
21
+ /**
22
+ * SQL-backed concrete `BaseEasRoute`. See `EasRouteMongo.ts`'s doc comment - the same mounting pattern
23
+ * applies here.
24
+ *
25
+ * @author Jean-Philippe Steinmetz
26
+ */
27
+ export class EasRouteSQL extends BaseEasRoute {
28
+ constructor() {
29
+ super(...arguments);
30
+ this.deviceSyncStateClass = DeviceSyncStateSQL;
31
+ this.mailboxClass = MailboxSQL;
32
+ this.commandHandlerClasses = [
33
+ ProvisionCommand,
34
+ FolderSyncCommandSQL,
35
+ SyncCommandSQL,
36
+ SendMailCommandSQL,
37
+ SmartForwardCommandSQL,
38
+ SmartReplyCommandSQL,
39
+ ItemOperationsCommandSQL,
40
+ SearchCommandSQL,
41
+ MeetingResponseCommandSQL,
42
+ SettingsCommandSQL,
43
+ PingCommand,
44
+ GetItemEstimateCommandSQL,
45
+ MoveItemsCommandSQL,
46
+ ResolveRecipientsCommandSQL,
47
+ ];
48
+ }
49
+ }
50
+ //# sourceMappingURL=EasRouteSQL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EasRouteSQL.js","sourceRoot":"","sources":["../../../src/sql/EasRouteSQL.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,2CAA2C,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,gDAAgD,CAAC;AAE7F;;;;;GAKG;AACH,MAAM,OAAO,WAAY,SAAQ,YAA4C;IAA7E;;QACc,yBAAoB,GAAQ,kBAAkB,CAAC;QAC/C,iBAAY,GAAQ,UAAU,CAAC;QAC/B,0BAAqB,GAAU;YACrC,gBAAgB;YAChB,oBAAoB;YACpB,cAAc;YACd,kBAAkB;YAClB,sBAAsB;YACtB,oBAAoB;YACpB,wBAAwB;YACxB,gBAAgB;YAChB,yBAAyB;YACzB,kBAAkB;YAClB,WAAW;YACX,yBAAyB;YACzB,mBAAmB;YACnB,2BAA2B;SAC9B,CAAC;IACN,CAAC;CAAA"}
@@ -0,0 +1,8 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ export * from "./EasRouteSQL.js";
6
+ export * from "./DeviceSyncStateRouteSQL.js";
7
+ export * from "../commands/sql/index.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sql/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,cAAc,kBAAkB,CAAC;AACjC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,6 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ export * from "./sql/index.js";
6
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/sql.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,mCAAmC;AACnC,+EAA+E;AAC/E,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type JWTUser } from "@rapidrest/core";
2
+ import { HttpRequest } from "@rapidrest/service-core";
3
+ import type { DeviceSyncState } from "@rapidmx/restapi";
4
+ /**
5
+ * Admin-only trigger for the `RemoteWipe` sub-flow `ProvisionCommand` implements. `restapi` has no route of its
6
+ * own for `DeviceSyncState` (it's a protocol-internal entity, not a domain object a normal API consumer ever
7
+ * lists or edits directly), so this lives here instead, following the exact `trustedRoles`/`UserUtils.hasRoles`
8
+ * gating pattern `BaseMailboxRoute` already uses for its own admin-vs-owner scoping.
9
+ *
10
+ * Setting `remoteWipeRequested: true` (and `provisioned: false` alongside it) is the entire trigger: the next
11
+ * request that device makes of any kind is already forced back through `Provision` by `BaseEasRoute.dispatch()`'s
12
+ * existing 449 gate, at which point `ProvisionCommand.issuePolicy` sees the flag and sends the device a
13
+ * `RemoteWipe` directive instead of a normal policy document - no separate push/notification channel is needed.
14
+ *
15
+ * `deviceSyncStateClass` is supplied by the Mongo/SQL concrete subclasses, the same one-line-per-backend
16
+ * pattern used throughout this library.
17
+ *
18
+ * @author Jean-Philippe Steinmetz
19
+ */
20
+ export declare abstract class BaseDeviceSyncStateRoute<D extends DeviceSyncState> {
21
+ protected abstract deviceSyncStateClass: any;
22
+ protected trustedRoles: string[];
23
+ private _objectFactory?;
24
+ private deviceSyncStateRepo?;
25
+ private getDeviceSyncStateRepo;
26
+ /**
27
+ * Marks `uid` (a `DeviceSyncState`'s own id, not a device id string - the admin looks this up via whatever
28
+ * device-listing view a deployment builds on top of `DeviceSyncState`'s ordinary CRUD, out of scope here)
29
+ * for remote wipe. Optional JSON body `{ accountOnly?: boolean }` — recorded for admin audit only; see
30
+ * `ProvisionCommand`'s own doc comment for why the wire directive sent to the device doesn't distinguish
31
+ * the two.
32
+ */
33
+ remoteWipe(uid: string, req: HttpRequest, user?: JWTUser): Promise<D>;
34
+ }
@@ -0,0 +1,64 @@
1
+ import { type JWTUser } from "@rapidrest/core";
2
+ import { HttpRequest, HttpResponse } from "@rapidrest/service-core";
3
+ import { DeviceSyncState, Mailbox } from "@rapidmx/restapi";
4
+ /**
5
+ * Abstract base for the single fixed EAS endpoint (`POST /Microsoft-Server-ActiveSync` by MS-ASHTTP
6
+ * convention, though the concrete path is left to the consuming application to mount via `@Route(...)` — see
7
+ * `BaseMailIngestRoute.ts` for the identical undecorated-base-class pattern this follows). Unlike every other
8
+ * route in this library, EAS dispatches on a `Cmd` query parameter against one URL rather than path-based REST
9
+ * routing, so there is exactly one `@Post()` method here, not one per operation.
10
+ *
11
+ * **Auth**: `@Auth(["jwt"])` — the framework's own default strategy, unchanged from every other route in this
12
+ * app. A real native EAS client obtaining that JWT in the first place (rather than the app's own web/API
13
+ * clients, which already have one) requires an OAuth 2.0 Authorization Server capability this library
14
+ * deliberately does not implement itself — see the architecture plan's "Auth" section for the full reasoning
15
+ * behind this choice over a per-request Basic Auth strategy.
16
+ *
17
+ * **Dispatch flow**: resolve the caller's own `Mailbox` (never a client-supplied one — `resolveCallerMailboxUid`,
18
+ * the same helper `BaseSearchRoute` already uses), find-or-create that (mailbox, device) pair's
19
+ * `DeviceSyncState`, enforce the provisioning gate, decode the WBXML request body (if any), dispatch to the
20
+ * matching registered `EasCommandHandler`, bump `lastSyncAt`, and encode the handler's response back to WBXML.
21
+ *
22
+ * **Command handlers** are supplied via `commandHandlerClasses` (empty by default — this class alone is just
23
+ * the transport skeleton; concrete command support, e.g. `ProvisionCommand`/`FolderSyncCommand`, is added
24
+ * incrementally in later work by having a concrete subclass populate this array) and instantiated once each in
25
+ * `@Init` via `ObjectFactory`, so a handler can `@Inject` its own dependencies like any other DI-managed class
26
+ * in this library.
27
+ *
28
+ * **`OPTIONS` protocol discovery**: real EAS clients conventionally probe `OPTIONS` before their first `POST`
29
+ * to read `MS-ASProtocolVersions`/`MS-ASProtocolCommands` and learn what the server supports - see `options()`
30
+ * below. This requires `@rapidrest/service-core` >=1.5.0, whose global CORS middleware consults
31
+ * `IHttpRouter.hasExplicitOptionsRoute()` before its blanket preflight `204` - confirmed live end to end
32
+ * against a real `service-core` 1.5.0 install (`test/routes/{mongo,sql}/EasRoute.test.ts`'s `OPTIONS`
33
+ * describe block), not assumed.
34
+ *
35
+ * `deviceSyncStateClass`/`mailboxClass` are supplied by the Mongo/SQL concrete subclasses, following the exact
36
+ * one-line-per-backend pattern used throughout this library's other routes/jobs.
37
+ *
38
+ * @author Jean-Philippe Steinmetz
39
+ */
40
+ export declare abstract class BaseEasRoute<D extends DeviceSyncState, M extends Mailbox = Mailbox> {
41
+ protected abstract deviceSyncStateClass: any;
42
+ protected abstract mailboxClass: any;
43
+ /** Command handler classes to instantiate (one each) in `@Init`. Empty until a concrete command lands -
44
+ * every request is then answered with HTTP 501 (see `dispatch()`), which is the correct, honest behavior
45
+ * for a transport skeleton with no commands implemented yet, not a bug to work around. */
46
+ protected commandHandlerClasses: any[];
47
+ private _objectFactory?;
48
+ private deviceSyncStateRepo?;
49
+ private mailboxRepo?;
50
+ private readonly handlers;
51
+ private logger;
52
+ init(): Promise<void>;
53
+ /**
54
+ * Answers a real client's pre-flight `MS-ASProtocolVersions`/`MS-ASProtocolCommands` capability probe -
55
+ * see this class's own doc comment for the `service-core` version dependency this needs to actually run.
56
+ * Deliberately unauthenticated (no `@Auth`): this is capability discovery, not mailbox access, and a real
57
+ * Exchange server answers it the same way regardless of credentials. `MS-ASProtocolCommands` is built from
58
+ * `this.handlers`, not a separately-maintained list, so it can never drift out of sync with the commands a
59
+ * concrete subclass actually registered via `commandHandlerClasses`.
60
+ */
61
+ options(res: HttpResponse): Promise<void>;
62
+ dispatch(req: HttpRequest, res: HttpResponse, user?: JWTUser): Promise<void>;
63
+ private findOrCreateDeviceSyncState;
64
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Formats a date as MS-ASDTYPE's "Compact DateTime" (`YYYYMMDDTHHMMSSZ`, always UTC) - the format
3
+ * `Calendar`/`Tasks` timestamp fields (`StartTime`/`EndTime`/`UtcDueDate`/...) use, distinct from the plain
4
+ * `dateTime` type (`YYYY-MM-DDTHH:MM:SS.MSSZ`, i.e. `Date.prototype.toISOString()`) `Email`'s `DateReceived`
5
+ * uses - confirmed against the published MS-ASDTYPE spec (`2.7.2 Compact DateTime` vs `2.7 dateTime Data
6
+ * Type`), not assumed, since sending the wrong one is exactly the kind of silent-until-a-real-device-connects
7
+ * bug this library's WBXML codec work already ran into once with tag casing (`"Mime"` vs `"MIME"`).
8
+ *
9
+ * Accepts `Date | string` and normalizes via `new Date(...)` - a real, discovered-by-testing gap: fields
10
+ * embedded inside a `simple-json` column (e.g. `RecurrenceRule.until`) round-trip through `JSON.stringify`/
11
+ * `JSON.parse` on the SQL backend, which does not preserve `Date` instances, so `until` comes back as a plain
12
+ * ISO string there even though the Mongo backend (native BSON dates) hands back a real `Date` for the exact
13
+ * same field - a caller passing either must work on both backends without knowing which one it's talking to.
14
+ */
15
+ export declare function toCompactDateTime(date: Date | string): string;
16
+ /**
17
+ * Parses MS-ASDTYPE's "Compact DateTime" (`YYYYMMDDTHHMMSSZ`) back into a `Date` - the reverse of
18
+ * `toCompactDateTime`, needed for `Sync`'s client-originated `Add`/`Change` commands on `Calendar`/`Tasks`.
19
+ * Throws (rather than returning an unvalidated `Date` that would silently carry `NaN`s) for anything not
20
+ * matching the exact expected shape.
21
+ */
22
+ export declare function fromCompactDateTime(value: string): Date;
@@ -0,0 +1,59 @@
1
+ import type { JWTUser } from "@rapidrest/core";
2
+ import type { HttpRequest, RepoUtils } from "@rapidrest/service-core";
3
+ import type { WbxmlElement } from "./codec/WbxmlElement.js";
4
+ import type { DeviceSyncState } from "@rapidmx/restapi";
5
+ /**
6
+ * Everything an `EasCommandHandler` needs to process one dispatched EAS command — assembled once by
7
+ * `BaseEasRoute.dispatch()` per request and handed to whichever handler matches `?Cmd=`.
8
+ *
9
+ * @author Jean-Philippe Steinmetz
10
+ */
11
+ export interface EasCommandContext {
12
+ /** The authenticated caller, per the same `@AuthUser` JWT payload every other route in this library reads. */
13
+ readonly user: JWTUser;
14
+ /** The `Mailbox` this request operates against — resolved server-side from `user` (`ownerUserUid`), never
15
+ * taken from client input. */
16
+ readonly mailboxUid: string;
17
+ /** The client-supplied `?DeviceId=` query value, identifying this device within the mailbox. */
18
+ readonly deviceId: string;
19
+ /** The client-supplied `?DeviceType=` query value (e.g. `iPhone`, `Android`). */
20
+ readonly deviceType: string;
21
+ /** The client-supplied `?PolicyKey=` query value, if present - the provisioning policy key the device is
22
+ * currently operating under. Not yet validated against `deviceSyncState.policyKey` here (deferred to
23
+ * `ProvisionCommand`'s own implementation); handlers that care should compare it themselves for now. */
24
+ readonly policyKey?: string;
25
+ /** This device's persisted sync/provisioning state, looked up (or newly created) by `BaseEasRoute` before
26
+ * dispatch. Handlers read/write cursor and provisioning fields on this directly. */
27
+ readonly deviceSyncState: DeviceSyncState;
28
+ /** The live repo backing `deviceSyncState`'s concrete entity class, for handlers that need to persist a
29
+ * change to it (e.g. a new `SyncKey`, an updated `policyKey`, flipping `provisioned`). Typed `RepoUtils<any>`
30
+ * rather than `RepoUtils<DeviceSyncState>` deliberately - `RepoUtils<D>`'s underlying TypeORM `Repository<D>`
31
+ * is not covariant in `D` (a handful of its methods, e.g. `sum()`, use `D`-dependent conditional types), so
32
+ * `BaseEasRoute`'s own `RepoUtils<D>` (for its concrete `D extends DeviceSyncState`) cannot be narrowed to
33
+ * this field's type without `any` somewhere in between. */
34
+ readonly deviceSyncStateRepo: RepoUtils<any>;
35
+ /** Every query-string parameter on the request, for the handful of commands with additional command-
36
+ * specific query parameters beyond the common four already broken out above. */
37
+ readonly query: Record<string, string | string[]>;
38
+ /** The decoded WBXML request body, or `undefined` for a command sent with an empty body (legal for a few
39
+ * commands, e.g. a bare `GetItemEstimate`-less `Ping` continuation). */
40
+ readonly request?: WbxmlElement;
41
+ /** The raw underlying HTTP request, for the rare handler that needs something this context doesn't
42
+ * already surface (e.g. a header). */
43
+ readonly req: HttpRequest;
44
+ }
45
+ /**
46
+ * One EAS protocol command (`Provision`, `FolderSync`, `Sync`, ...). `BaseEasRoute` builds one instance of
47
+ * each registered handler class in its own `@Init` (via `ObjectFactory`, so a handler can `@Inject` its own
48
+ * dependencies exactly like any other DI-managed class in this library) and dispatches to the one whose
49
+ * `command` matches the request's `?Cmd=` value.
50
+ *
51
+ * @author Jean-Philippe Steinmetz
52
+ */
53
+ export interface EasCommandHandler {
54
+ /** The exact `?Cmd=` value this handler answers to (e.g. `"FolderSync"`). */
55
+ readonly command: string;
56
+ /** Processes the command and returns the WBXML element tree to send back as the response body, or
57
+ * `undefined` for a command whose successful response is legitimately empty. */
58
+ handle(ctx: EasCommandContext): Promise<WbxmlElement | undefined>;
59
+ }