@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.
- package/LICENSE +382 -0
- package/README.md +57 -0
- package/dist/lib/BaseDeviceSyncStateRoute.js +90 -0
- package/dist/lib/BaseDeviceSyncStateRoute.js.map +1 -0
- package/dist/lib/BaseEasRoute.js +213 -0
- package/dist/lib/BaseEasRoute.js.map +1 -0
- package/dist/lib/CompactDateTime.js +43 -0
- package/dist/lib/CompactDateTime.js.map +1 -0
- package/dist/lib/EasCommandHandler.js +2 -0
- package/dist/lib/EasCommandHandler.js.map +1 -0
- package/dist/lib/EasSyncKeyUtils.js +119 -0
- package/dist/lib/EasSyncKeyUtils.js.map +1 -0
- package/dist/lib/adapters/CalendarSyncAdapter.js +255 -0
- package/dist/lib/adapters/CalendarSyncAdapter.js.map +1 -0
- package/dist/lib/adapters/ContactsSyncAdapter.js +164 -0
- package/dist/lib/adapters/ContactsSyncAdapter.js.map +1 -0
- package/dist/lib/adapters/EasCollectionSyncAdapter.js +2 -0
- package/dist/lib/adapters/EasCollectionSyncAdapter.js.map +1 -0
- package/dist/lib/adapters/EmailSyncAdapter.js +230 -0
- package/dist/lib/adapters/EmailSyncAdapter.js.map +1 -0
- package/dist/lib/adapters/TasksSyncAdapter.js +100 -0
- package/dist/lib/adapters/TasksSyncAdapter.js.map +1 -0
- package/dist/lib/codec/WbxmlCodePages.js +706 -0
- package/dist/lib/codec/WbxmlCodePages.js.map +1 -0
- package/dist/lib/codec/WbxmlDecoder.js +154 -0
- package/dist/lib/codec/WbxmlDecoder.js.map +1 -0
- package/dist/lib/codec/WbxmlElement.js +31 -0
- package/dist/lib/codec/WbxmlElement.js.map +1 -0
- package/dist/lib/codec/WbxmlEncoder.js +88 -0
- package/dist/lib/codec/WbxmlEncoder.js.map +1 -0
- package/dist/lib/commands/ComposeMailCommand.js +187 -0
- package/dist/lib/commands/ComposeMailCommand.js.map +1 -0
- package/dist/lib/commands/FolderSyncCommand.js +150 -0
- package/dist/lib/commands/FolderSyncCommand.js.map +1 -0
- package/dist/lib/commands/GetItemEstimateCommand.js +149 -0
- package/dist/lib/commands/GetItemEstimateCommand.js.map +1 -0
- package/dist/lib/commands/ItemOperationsCommand.js +337 -0
- package/dist/lib/commands/ItemOperationsCommand.js.map +1 -0
- package/dist/lib/commands/MeetingResponseCommand.js +120 -0
- package/dist/lib/commands/MeetingResponseCommand.js.map +1 -0
- package/dist/lib/commands/MoveItemsCommand.js +103 -0
- package/dist/lib/commands/MoveItemsCommand.js.map +1 -0
- package/dist/lib/commands/PingCommand.js +145 -0
- package/dist/lib/commands/PingCommand.js.map +1 -0
- package/dist/lib/commands/ProvisionCommand.js +164 -0
- package/dist/lib/commands/ProvisionCommand.js.map +1 -0
- package/dist/lib/commands/ResolveRecipientsCommand.js +124 -0
- package/dist/lib/commands/ResolveRecipientsCommand.js.map +1 -0
- package/dist/lib/commands/SearchCommand.js +137 -0
- package/dist/lib/commands/SearchCommand.js.map +1 -0
- package/dist/lib/commands/SendMailCommand.js +18 -0
- package/dist/lib/commands/SendMailCommand.js.map +1 -0
- package/dist/lib/commands/SettingsCommand.js +138 -0
- package/dist/lib/commands/SettingsCommand.js.map +1 -0
- package/dist/lib/commands/SmartForwardCommand.js +22 -0
- package/dist/lib/commands/SmartForwardCommand.js.map +1 -0
- package/dist/lib/commands/SmartReplyCommand.js +22 -0
- package/dist/lib/commands/SmartReplyCommand.js.map +1 -0
- package/dist/lib/commands/SyncCommand.js +406 -0
- package/dist/lib/commands/SyncCommand.js.map +1 -0
- package/dist/lib/commands/mongo/FolderSyncCommandMongo.js +16 -0
- package/dist/lib/commands/mongo/FolderSyncCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/GetItemEstimateCommandMongo.js +21 -0
- package/dist/lib/commands/mongo/GetItemEstimateCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/ItemOperationsCommandMongo.js +18 -0
- package/dist/lib/commands/mongo/ItemOperationsCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/MeetingResponseCommandMongo.js +17 -0
- package/dist/lib/commands/mongo/MeetingResponseCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/MoveItemsCommandMongo.js +17 -0
- package/dist/lib/commands/mongo/MoveItemsCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/ResolveRecipientsCommandMongo.js +20 -0
- package/dist/lib/commands/mongo/ResolveRecipientsCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/SearchCommandMongo.js +20 -0
- package/dist/lib/commands/mongo/SearchCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/SendMailCommandMongo.js +17 -0
- package/dist/lib/commands/mongo/SendMailCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/SettingsCommandMongo.js +16 -0
- package/dist/lib/commands/mongo/SettingsCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/SmartForwardCommandMongo.js +17 -0
- package/dist/lib/commands/mongo/SmartForwardCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/SmartReplyCommandMongo.js +17 -0
- package/dist/lib/commands/mongo/SmartReplyCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/SyncCommandMongo.js +26 -0
- package/dist/lib/commands/mongo/SyncCommandMongo.js.map +1 -0
- package/dist/lib/commands/mongo/index.js +14 -0
- package/dist/lib/commands/mongo/index.js.map +1 -0
- package/dist/lib/commands/sql/FolderSyncCommandSQL.js +16 -0
- package/dist/lib/commands/sql/FolderSyncCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/GetItemEstimateCommandSQL.js +21 -0
- package/dist/lib/commands/sql/GetItemEstimateCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/ItemOperationsCommandSQL.js +18 -0
- package/dist/lib/commands/sql/ItemOperationsCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/MeetingResponseCommandSQL.js +17 -0
- package/dist/lib/commands/sql/MeetingResponseCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/MoveItemsCommandSQL.js +17 -0
- package/dist/lib/commands/sql/MoveItemsCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/ResolveRecipientsCommandSQL.js +20 -0
- package/dist/lib/commands/sql/ResolveRecipientsCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/SearchCommandSQL.js +20 -0
- package/dist/lib/commands/sql/SearchCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/SendMailCommandSQL.js +17 -0
- package/dist/lib/commands/sql/SendMailCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/SettingsCommandSQL.js +16 -0
- package/dist/lib/commands/sql/SettingsCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/SmartForwardCommandSQL.js +17 -0
- package/dist/lib/commands/sql/SmartForwardCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/SmartReplyCommandSQL.js +17 -0
- package/dist/lib/commands/sql/SmartReplyCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/SyncCommandSQL.js +26 -0
- package/dist/lib/commands/sql/SyncCommandSQL.js.map +1 -0
- package/dist/lib/commands/sql/index.js +14 -0
- package/dist/lib/commands/sql/index.js.map +1 -0
- package/dist/lib/index.js +56 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/mongo/DeviceSyncStateRouteMongo.js +16 -0
- package/dist/lib/mongo/DeviceSyncStateRouteMongo.js.map +1 -0
- package/dist/lib/mongo/EasRouteMongo.js +51 -0
- package/dist/lib/mongo/EasRouteMongo.js.map +1 -0
- package/dist/lib/mongo/index.js +8 -0
- package/dist/lib/mongo/index.js.map +1 -0
- package/dist/lib/mongo.js +6 -0
- package/dist/lib/mongo.js.map +1 -0
- package/dist/lib/sql/DeviceSyncStateRouteSQL.js +16 -0
- package/dist/lib/sql/DeviceSyncStateRouteSQL.js.map +1 -0
- package/dist/lib/sql/EasRouteSQL.js +50 -0
- package/dist/lib/sql/EasRouteSQL.js.map +1 -0
- package/dist/lib/sql/index.js +8 -0
- package/dist/lib/sql/index.js.map +1 -0
- package/dist/lib/sql.js +6 -0
- package/dist/lib/sql.js.map +1 -0
- package/dist/types/BaseDeviceSyncStateRoute.d.ts +34 -0
- package/dist/types/BaseEasRoute.d.ts +64 -0
- package/dist/types/CompactDateTime.d.ts +22 -0
- package/dist/types/EasCommandHandler.d.ts +59 -0
- package/dist/types/EasSyncKeyUtils.d.ts +89 -0
- package/dist/types/adapters/CalendarSyncAdapter.d.ts +52 -0
- package/dist/types/adapters/ContactsSyncAdapter.d.ts +33 -0
- package/dist/types/adapters/EasCollectionSyncAdapter.d.ts +52 -0
- package/dist/types/adapters/EmailSyncAdapter.d.ts +53 -0
- package/dist/types/adapters/TasksSyncAdapter.d.ts +32 -0
- package/dist/types/codec/WbxmlCodePages.d.ts +45 -0
- package/dist/types/codec/WbxmlDecoder.d.ts +33 -0
- package/dist/types/codec/WbxmlElement.d.ts +43 -0
- package/dist/types/codec/WbxmlEncoder.d.ts +20 -0
- package/dist/types/commands/ComposeMailCommand.d.ts +50 -0
- package/dist/types/commands/FolderSyncCommand.d.ts +25 -0
- package/dist/types/commands/GetItemEstimateCommand.d.ts +43 -0
- package/dist/types/commands/ItemOperationsCommand.d.ts +72 -0
- package/dist/types/commands/MeetingResponseCommand.d.ts +32 -0
- package/dist/types/commands/MoveItemsCommand.d.ts +29 -0
- package/dist/types/commands/PingCommand.d.ts +33 -0
- package/dist/types/commands/ProvisionCommand.d.ts +54 -0
- package/dist/types/commands/ResolveRecipientsCommand.d.ts +34 -0
- package/dist/types/commands/SearchCommand.d.ts +39 -0
- package/dist/types/commands/SendMailCommand.d.ts +10 -0
- package/dist/types/commands/SettingsCommand.d.ts +37 -0
- package/dist/types/commands/SmartForwardCommand.d.ts +17 -0
- package/dist/types/commands/SmartReplyCommand.d.ts +17 -0
- package/dist/types/commands/SyncCommand.d.ts +100 -0
- package/dist/types/commands/mongo/FolderSyncCommandMongo.d.ts +8 -0
- package/dist/types/commands/mongo/GetItemEstimateCommandMongo.d.ts +7 -0
- package/dist/types/commands/mongo/ItemOperationsCommandMongo.d.ts +9 -0
- package/dist/types/commands/mongo/MeetingResponseCommandMongo.d.ts +8 -0
- package/dist/types/commands/mongo/MoveItemsCommandMongo.d.ts +8 -0
- package/dist/types/commands/mongo/ResolveRecipientsCommandMongo.d.ts +8 -0
- package/dist/types/commands/mongo/SearchCommandMongo.d.ts +8 -0
- package/dist/types/commands/mongo/SendMailCommandMongo.d.ts +8 -0
- package/dist/types/commands/mongo/SettingsCommandMongo.d.ts +7 -0
- package/dist/types/commands/mongo/SmartForwardCommandMongo.d.ts +8 -0
- package/dist/types/commands/mongo/SmartReplyCommandMongo.d.ts +8 -0
- package/dist/types/commands/mongo/SyncCommandMongo.d.ts +8 -0
- package/dist/types/commands/mongo/index.d.ts +9 -0
- package/dist/types/commands/sql/FolderSyncCommandSQL.d.ts +8 -0
- package/dist/types/commands/sql/GetItemEstimateCommandSQL.d.ts +7 -0
- package/dist/types/commands/sql/ItemOperationsCommandSQL.d.ts +9 -0
- package/dist/types/commands/sql/MeetingResponseCommandSQL.d.ts +8 -0
- package/dist/types/commands/sql/MoveItemsCommandSQL.d.ts +8 -0
- package/dist/types/commands/sql/ResolveRecipientsCommandSQL.d.ts +8 -0
- package/dist/types/commands/sql/SearchCommandSQL.d.ts +8 -0
- package/dist/types/commands/sql/SendMailCommandSQL.d.ts +8 -0
- package/dist/types/commands/sql/SettingsCommandSQL.d.ts +7 -0
- package/dist/types/commands/sql/SmartForwardCommandSQL.d.ts +8 -0
- package/dist/types/commands/sql/SmartReplyCommandSQL.d.ts +8 -0
- package/dist/types/commands/sql/SyncCommandSQL.d.ts +8 -0
- package/dist/types/commands/sql/index.d.ts +9 -0
- package/dist/types/index.d.ts +51 -0
- package/dist/types/mongo/DeviceSyncStateRouteMongo.d.ts +8 -0
- package/dist/types/mongo/EasRouteMongo.d.ts +14 -0
- package/dist/types/mongo/index.d.ts +3 -0
- package/dist/types/mongo.d.ts +1 -0
- package/dist/types/sql/DeviceSyncStateRouteSQL.d.ts +8 -0
- package/dist/types/sql/EasRouteSQL.d.ts +13 -0
- package/dist/types/sql/index.d.ts +3 -0
- package/dist/types/sql.d.ts +1 -0
- 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"}
|
package/dist/lib/sql.js
ADDED
|
@@ -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
|
+
}
|