@xemahq/biomes-platform-ms365 0.1.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.
@@ -0,0 +1,81 @@
1
+ export declare enum GraphChangeType {
2
+ CREATED = "created",
3
+ UPDATED = "updated",
4
+ DELETED = "deleted"
5
+ }
6
+ export interface GraphChangeNotification {
7
+ readonly subscriptionId: string;
8
+ readonly subscriptionExpirationDateTime?: string;
9
+ readonly changeType: GraphChangeType;
10
+ readonly clientState?: string;
11
+ readonly resource: string;
12
+ readonly resourceData?: {
13
+ readonly id?: string;
14
+ readonly '@odata.type'?: string;
15
+ readonly '@odata.id'?: string;
16
+ };
17
+ readonly tenantId?: string;
18
+ }
19
+ export interface GraphChangeNotificationCollection {
20
+ readonly value: readonly GraphChangeNotification[];
21
+ }
22
+ export interface GraphEmailAddress {
23
+ readonly name?: string;
24
+ readonly address?: string;
25
+ }
26
+ export interface GraphRecipient {
27
+ readonly emailAddress?: GraphEmailAddress;
28
+ }
29
+ export interface GraphItemBody {
30
+ readonly contentType?: string;
31
+ readonly content?: string;
32
+ }
33
+ export interface GraphFileAttachment {
34
+ readonly '@odata.type'?: string;
35
+ readonly id?: string;
36
+ readonly name?: string;
37
+ readonly contentType?: string;
38
+ readonly size?: number;
39
+ readonly contentId?: string;
40
+ readonly isInline?: boolean;
41
+ }
42
+ export interface GraphMessageResource {
43
+ readonly id: string;
44
+ readonly conversationId?: string;
45
+ readonly internetMessageId?: string;
46
+ readonly subject?: string;
47
+ readonly receivedDateTime?: string;
48
+ readonly sentDateTime?: string;
49
+ readonly from?: GraphRecipient;
50
+ readonly sender?: GraphRecipient;
51
+ readonly toRecipients?: readonly GraphRecipient[];
52
+ readonly ccRecipients?: readonly GraphRecipient[];
53
+ readonly bccRecipients?: readonly GraphRecipient[];
54
+ readonly body?: GraphItemBody;
55
+ readonly bodyPreview?: string;
56
+ readonly categories?: readonly string[];
57
+ readonly hasAttachments?: boolean;
58
+ readonly attachments?: readonly GraphFileAttachment[];
59
+ readonly internetMessageHeaders?: ReadonlyArray<{
60
+ readonly name?: string;
61
+ readonly value?: string;
62
+ }>;
63
+ }
64
+ export interface GraphSubscription {
65
+ readonly id: string;
66
+ readonly resource: string;
67
+ readonly changeType: GraphChangeType;
68
+ readonly notificationUrl: string;
69
+ readonly expirationDateTime: string;
70
+ readonly clientState?: string;
71
+ }
72
+ export interface GraphUser {
73
+ readonly mail?: string | null;
74
+ readonly userPrincipalName?: string;
75
+ }
76
+ export interface GraphMessageDeltaPage {
77
+ readonly value: readonly GraphMessageResource[];
78
+ readonly '@odata.nextLink'?: string;
79
+ readonly '@odata.deltaLink'?: string;
80
+ }
81
+ //# sourceMappingURL=graph-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-types.d.ts","sourceRoot":"","sources":["../../src/graph/graph-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export var GraphChangeType;
2
+ (function (GraphChangeType) {
3
+ GraphChangeType["CREATED"] = "created";
4
+ GraphChangeType["UPDATED"] = "updated";
5
+ GraphChangeType["DELETED"] = "deleted";
6
+ })(GraphChangeType || (GraphChangeType = {}));
7
+ //# sourceMappingURL=graph-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-types.js","sourceRoot":"","sources":["../../src/graph/graph-types.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAN,IAAY,eAIX;AAJD,WAAY,eAAe;IACzB,sCAAmB,CAAA;IACnB,sCAAmB,CAAA;IACnB,sCAAmB,CAAA;AACrB,CAAC,EAJW,eAAe,KAAf,eAAe,QAI1B"}
@@ -0,0 +1,12 @@
1
+ import { type MappedEnvelope, type Result } from '@xemahq/biome-sdk/adapter';
2
+ import type { GraphMessageResource } from './graph-types.js';
3
+ export declare const MAIL_ENTITY_KIND_MESSAGE = "MESSAGE";
4
+ export declare const MAIL_EVENT: {
5
+ readonly MESSAGE_RECEIVED: "mail.message.received";
6
+ readonly MESSAGE_SENT: "mail.message.sent";
7
+ };
8
+ export interface BuildMailEnvelopeOptions {
9
+ readonly event?: (typeof MAIL_EVENT)[keyof typeof MAIL_EVENT];
10
+ }
11
+ export declare function buildMailEnvelope(message: GraphMessageResource, options?: BuildMailEnvelopeOptions): Result<MappedEnvelope>;
12
+ //# sourceMappingURL=mail-envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-envelope.d.ts","sourceRoot":"","sources":["../../src/graph/mail-envelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAIjF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAgB7D,eAAO,MAAM,wBAAwB,YAAY,CAAC;AAGlD,eAAO,MAAM,UAAU;;;CAGb,CAAC;AAEX,MAAM,WAAW,wBAAwB;IAKvC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;CAC/D;AAOD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAAC,cAAc,CAAC,CAcxB"}
@@ -0,0 +1,23 @@
1
+ import { ok } from '@xemahq/biome-sdk/adapter';
2
+ import { normalizeGraphMessage } from './message-normalizer.js';
3
+ export const MAIL_ENTITY_KIND_MESSAGE = 'MESSAGE';
4
+ export const MAIL_EVENT = {
5
+ MESSAGE_RECEIVED: 'mail.message.received',
6
+ MESSAGE_SENT: 'mail.message.sent',
7
+ };
8
+ export function buildMailEnvelope(message, options = {}) {
9
+ const normalized = normalizeGraphMessage(message);
10
+ if (!normalized.ok) {
11
+ return normalized;
12
+ }
13
+ const payload = normalized.value;
14
+ const envelope = {
15
+ entityKind: MAIL_ENTITY_KIND_MESSAGE,
16
+ event: options.event ?? MAIL_EVENT.MESSAGE_RECEIVED,
17
+ payload: payload,
18
+ externalId: payload.messageId,
19
+ ...(payload.threadId === undefined ? {} : { externalSpaceKey: payload.threadId }),
20
+ };
21
+ return ok(envelope);
22
+ }
23
+ //# sourceMappingURL=mail-envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail-envelope.js","sourceRoot":"","sources":["../../src/graph/mail-envelope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAoC,MAAM,2BAA2B,CAAC;AAEjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAkBhE,MAAM,CAAC,MAAM,wBAAwB,GAAG,SAAS,CAAC;AAGlD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,gBAAgB,EAAE,uBAAuB;IACzC,YAAY,EAAE,mBAAmB;CACzB,CAAC;AAeX,MAAM,UAAU,iBAAiB,CAC/B,OAA6B,EAC7B,UAAoC,EAAE;IAEtC,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC;IACjC,MAAM,QAAQ,GAAmB;QAC/B,UAAU,EAAE,wBAAwB;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,gBAAgB;QACnD,OAAO,EAAE,OAAuD;QAChE,UAAU,EAAE,OAAO,CAAC,SAAS;QAC7B,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;KAClF,CAAC;IACF,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type Result } from '@xemahq/biome-sdk/adapter';
2
+ import type { GraphMessageResource } from './graph-types.js';
3
+ export interface CanonicalMailAttachment {
4
+ readonly filename: string;
5
+ readonly contentType: string;
6
+ readonly size: number;
7
+ readonly contentId?: string;
8
+ }
9
+ export interface CanonicalMailMessage {
10
+ readonly messageId: string;
11
+ readonly threadId?: string;
12
+ readonly from: string;
13
+ readonly to: string[];
14
+ readonly cc?: string[];
15
+ readonly bcc?: string[];
16
+ readonly subject: string;
17
+ readonly bodyText?: string;
18
+ readonly bodyHtml?: string;
19
+ readonly headers?: Record<string, string>;
20
+ readonly receivedAt: string;
21
+ readonly labels?: string[];
22
+ readonly attachments?: CanonicalMailAttachment[];
23
+ }
24
+ export declare function normalizeGraphMessage(message: GraphMessageResource): Result<CanonicalMailMessage>;
25
+ //# sourceMappingURL=message-normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-normalizer.d.ts","sourceRoot":"","sources":["../../src/graph/message-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAE/E,OAAO,KAAK,EAEV,oBAAoB,EAErB,MAAM,kBAAkB,CAAC;AAoB1B,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,uBAAuB,EAAE,CAAC;CAClD;AAYD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,oBAAoB,GAC5B,MAAM,CAAC,oBAAoB,CAAC,CA4E9B"}
@@ -0,0 +1,143 @@
1
+ import { adapterError, err, ok } from '@xemahq/biome-sdk/adapter';
2
+ const FILE_ATTACHMENT_ODATA_TYPE = '#microsoft.graph.fileAttachment';
3
+ export function normalizeGraphMessage(message) {
4
+ if (!message || typeof message !== 'object') {
5
+ return err(adapterError('malformed-payload', 'graph message resource is not an object'));
6
+ }
7
+ const messageId = nonEmpty(message.id);
8
+ if (!messageId) {
9
+ return err(adapterError('malformed-payload', 'graph message: id required'));
10
+ }
11
+ const from = recipientAddress(message.from) ?? recipientAddress(message.sender);
12
+ if (!from) {
13
+ return err(adapterError('malformed-payload', 'graph message: from.emailAddress.address (or sender) required', { path: 'from.emailAddress.address' }));
14
+ }
15
+ const to = recipientAddresses(message.toRecipients);
16
+ if (to.length === 0) {
17
+ return err(adapterError('malformed-payload', 'graph message: at least one toRecipients[].emailAddress.address required', { path: 'toRecipients' }));
18
+ }
19
+ const subject = typeof message.subject === 'string' ? message.subject : '';
20
+ const receivedAt = resolveReceivedAt(message);
21
+ if (!receivedAt) {
22
+ return err(adapterError('malformed-payload', 'graph message: receivedDateTime or sentDateTime required', { path: 'receivedDateTime' }));
23
+ }
24
+ const cc = recipientAddresses(message.ccRecipients);
25
+ const bcc = recipientAddresses(message.bccRecipients);
26
+ const { bodyText, bodyHtml } = splitBody(message);
27
+ const headers = normalizeHeaders(message);
28
+ const labels = normalizeLabels(message.categories);
29
+ const attachments = normalizeAttachments(message.attachments);
30
+ const canonical = {
31
+ messageId,
32
+ from,
33
+ to,
34
+ subject,
35
+ receivedAt,
36
+ ...optional('threadId', nonEmpty(message.conversationId)),
37
+ ...optionalArray('cc', cc),
38
+ ...optionalArray('bcc', bcc),
39
+ ...optional('bodyText', bodyText),
40
+ ...optional('bodyHtml', bodyHtml),
41
+ ...optional('headers', headers),
42
+ ...optionalArray('labels', labels),
43
+ ...optionalArray('attachments', attachments),
44
+ };
45
+ return ok(canonical);
46
+ }
47
+ function resolveReceivedAt(message) {
48
+ return nonEmpty(message.receivedDateTime) ?? nonEmpty(message.sentDateTime);
49
+ }
50
+ function splitBody(message) {
51
+ const body = message.body;
52
+ if (body && typeof body === 'object') {
53
+ const content = typeof body.content === 'string' ? body.content : undefined;
54
+ if (content !== undefined && content.length > 0) {
55
+ const contentType = (body.contentType ?? '').toLowerCase();
56
+ if (contentType === 'html') {
57
+ return { bodyHtml: content };
58
+ }
59
+ return { bodyText: content };
60
+ }
61
+ }
62
+ const preview = nonEmpty(message.bodyPreview);
63
+ return preview ? { bodyText: preview } : {};
64
+ }
65
+ function normalizeHeaders(message) {
66
+ const out = {};
67
+ const internetMessageId = nonEmpty(message.internetMessageId);
68
+ if (internetMessageId) {
69
+ out['message-id'] = internetMessageId;
70
+ }
71
+ for (const header of message.internetMessageHeaders ?? []) {
72
+ const name = nonEmpty(header?.name);
73
+ const value = typeof header?.value === 'string' ? header.value : undefined;
74
+ if (name && value !== undefined) {
75
+ out[name.toLowerCase()] = value;
76
+ }
77
+ }
78
+ return Object.keys(out).length > 0 ? out : undefined;
79
+ }
80
+ function normalizeLabels(categories) {
81
+ if (!Array.isArray(categories)) {
82
+ return [];
83
+ }
84
+ return categories.filter((c) => typeof c === 'string' && c.length > 0);
85
+ }
86
+ function normalizeAttachments(attachments) {
87
+ if (!Array.isArray(attachments)) {
88
+ return [];
89
+ }
90
+ const out = [];
91
+ for (const raw of attachments) {
92
+ if (!raw || typeof raw !== 'object') {
93
+ continue;
94
+ }
95
+ const odataType = raw['@odata.type'];
96
+ if (odataType !== undefined && odataType !== FILE_ATTACHMENT_ODATA_TYPE) {
97
+ continue;
98
+ }
99
+ const filename = nonEmpty(raw.name);
100
+ const contentType = nonEmpty(raw.contentType);
101
+ if (!filename || !contentType) {
102
+ continue;
103
+ }
104
+ const size = typeof raw.size === 'number' && raw.size >= 0 ? raw.size : 0;
105
+ const contentId = nonEmpty(raw.contentId);
106
+ out.push({
107
+ filename,
108
+ contentType,
109
+ size,
110
+ ...optional('contentId', contentId),
111
+ });
112
+ }
113
+ return out;
114
+ }
115
+ function recipientAddress(recipient) {
116
+ if (!recipient || typeof recipient !== 'object') {
117
+ return undefined;
118
+ }
119
+ return nonEmpty(recipient.emailAddress?.address);
120
+ }
121
+ function recipientAddresses(recipients) {
122
+ if (!Array.isArray(recipients)) {
123
+ return [];
124
+ }
125
+ const out = [];
126
+ for (const recipient of recipients) {
127
+ const address = recipientAddress(recipient);
128
+ if (address) {
129
+ out.push(address);
130
+ }
131
+ }
132
+ return out;
133
+ }
134
+ function nonEmpty(value) {
135
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
136
+ }
137
+ function optional(key, value) {
138
+ return value === undefined ? {} : { [key]: value };
139
+ }
140
+ function optionalArray(key, value) {
141
+ return value.length === 0 ? {} : { [key]: value };
142
+ }
143
+ //# sourceMappingURL=message-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-normalizer.js","sourceRoot":"","sources":["../../src/graph/message-normalizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type Result } from '@xemahq/biome-sdk/adapter';
2
+ import { GraphClient, type CreateSubscriptionInput } from './graph-client.js';
3
+ import type { GraphChangeNotification, GraphMessageResource, GraphSubscription } from './graph-types.js';
4
+ export declare function resolveValidationHandshake(query: Readonly<Record<string, string | undefined>>): string | null;
5
+ export declare function verifyClientState(notification: GraphChangeNotification, expectedClientState: string): Result<void>;
6
+ export interface ParsedMessageResource {
7
+ readonly userId: string;
8
+ readonly messageId: string;
9
+ }
10
+ export declare function parseMessageResourcePath(notification: GraphChangeNotification): Result<ParsedMessageResource>;
11
+ export declare function isRenewalDue(expirationDateTime: string, now?: number): boolean;
12
+ export declare function nextExpiration(now?: number): string;
13
+ export declare function getMailboxAddress(client: GraphClient): Promise<Result<string>>;
14
+ export declare function establishInboxSubscription(client: GraphClient, input: CreateSubscriptionInput): Promise<Result<GraphSubscription>>;
15
+ export declare function renewIfDue(client: GraphClient, subscription: Pick<GraphSubscription, 'id' | 'expirationDateTime'>, now?: number): Promise<Result<GraphSubscription | null>>;
16
+ export declare function drainMessageDelta(client: GraphClient, userId: string, startLink: string | undefined, onMessage: (message: GraphMessageResource) => Promise<void>, maxPages?: number): Promise<Result<{
17
+ deltaLink: string | null;
18
+ }>>;
19
+ //# sourceMappingURL=subscription-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-lifecycle.d.ts","sourceRoot":"","sources":["../../src/graph/subscription-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAE/E,OAAO,EACL,WAAW,EAGX,KAAK,uBAAuB,EAC7B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EACV,uBAAuB,EACvB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AA6B1B,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,GAClD,MAAM,GAAG,IAAI,CAGf;AASD,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,uBAAuB,EACrC,mBAAmB,EAAE,MAAM,GAC1B,MAAM,CAAC,IAAI,CAAC,CASd;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAWD,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,uBAAuB,GACpC,MAAM,CAAC,qBAAqB,CAAC,CAmB/B;AAuCD,wBAAgB,YAAY,CAC1B,kBAAkB,EAAE,MAAM,EAC1B,GAAG,GAAE,MAAmB,GACvB,OAAO,CAOT;AAGD,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAmB,GAAG,MAAM,CAE/D;AAeD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAYpF;AAUD,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAEpC;AAUD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,oBAAoB,CAAC,EAClE,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,CAS3C;AAeD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,EAC3D,QAAQ,SAAK,GACZ,OAAO,CAAC,MAAM,CAAC;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC,CAuB/C"}
@@ -0,0 +1,114 @@
1
+ import { adapterError, err, ok } from '@xemahq/biome-sdk/adapter';
2
+ import { MAX_SUBSCRIPTION_LIFETIME_MS, SUBSCRIPTION_RENEWAL_SKEW_MS, } from './graph-client.js';
3
+ export function resolveValidationHandshake(query) {
4
+ const token = query['validationToken'];
5
+ return typeof token === 'string' && token.length > 0 ? token : null;
6
+ }
7
+ export function verifyClientState(notification, expectedClientState) {
8
+ const provided = notification.clientState;
9
+ if (typeof provided !== 'string' || provided.length === 0) {
10
+ return err(adapterError('verification-failed', 'graph notification missing clientState'));
11
+ }
12
+ if (provided !== expectedClientState) {
13
+ return err(adapterError('verification-failed', 'graph notification clientState mismatch'));
14
+ }
15
+ return ok(undefined);
16
+ }
17
+ export function parseMessageResourcePath(notification) {
18
+ const resource = notification.resource;
19
+ if (typeof resource !== 'string' || resource.length === 0) {
20
+ return err(adapterError('malformed-payload', 'graph notification: empty resource path'));
21
+ }
22
+ const userId = extractSegment(resource, 'users');
23
+ if (!userId) {
24
+ return err(adapterError('malformed-payload', `graph notification: cannot extract userId from "${resource}"`));
25
+ }
26
+ const messageId = nonEmpty(notification.resourceData?.id) ?? extractSegment(resource, 'messages');
27
+ if (!messageId) {
28
+ return err(adapterError('malformed-payload', `graph notification: cannot extract messageId from "${resource}"`));
29
+ }
30
+ return ok({ userId, messageId });
31
+ }
32
+ function extractSegment(resource, segment) {
33
+ const parts = resource.split('/').filter((p) => p.length > 0);
34
+ for (let i = 0; i < parts.length - 1; i++) {
35
+ const keyMatch = /^([A-Za-z]+)(?:\('([^']*)'\))?$/.exec(parts[i] ?? '');
36
+ if (!keyMatch) {
37
+ continue;
38
+ }
39
+ const [, key, inlineValue] = keyMatch;
40
+ if (key?.toLowerCase() !== segment.toLowerCase()) {
41
+ continue;
42
+ }
43
+ if (inlineValue && inlineValue.length > 0) {
44
+ return inlineValue;
45
+ }
46
+ const next = parts[i + 1] ?? '';
47
+ const nextInline = /^[A-Za-z]+\('([^']*)'\)$/.exec(next);
48
+ if (nextInline?.[1]) {
49
+ return nextInline[1];
50
+ }
51
+ return next.length > 0 ? next : undefined;
52
+ }
53
+ return undefined;
54
+ }
55
+ export function isRenewalDue(expirationDateTime, now = Date.now()) {
56
+ const expiresAt = Date.parse(expirationDateTime);
57
+ if (Number.isNaN(expiresAt)) {
58
+ return true;
59
+ }
60
+ return expiresAt - now <= SUBSCRIPTION_RENEWAL_SKEW_MS;
61
+ }
62
+ export function nextExpiration(now = Date.now()) {
63
+ return new Date(now + MAX_SUBSCRIPTION_LIFETIME_MS).toISOString();
64
+ }
65
+ export async function getMailboxAddress(client) {
66
+ const result = await client.getMe();
67
+ if (!result.ok) {
68
+ return result;
69
+ }
70
+ const address = nonEmpty(result.value.mail) ?? nonEmpty(result.value.userPrincipalName);
71
+ if (!address) {
72
+ return err(adapterError('malformed-payload', 'graph /me returned neither mail nor userPrincipalName'));
73
+ }
74
+ return ok(address);
75
+ }
76
+ export async function establishInboxSubscription(client, input) {
77
+ return client.createSubscription(input);
78
+ }
79
+ export async function renewIfDue(client, subscription, now = Date.now()) {
80
+ if (!isRenewalDue(subscription.expirationDateTime, now)) {
81
+ return ok(null);
82
+ }
83
+ const result = await client.renewSubscription(subscription.id);
84
+ if (!result.ok) {
85
+ return result;
86
+ }
87
+ return ok(result.value);
88
+ }
89
+ export async function drainMessageDelta(client, userId, startLink, onMessage, maxPages = 50) {
90
+ let cursor = startLink;
91
+ let deltaLink = null;
92
+ for (let page = 0; page < maxPages; page++) {
93
+ const result = await client.getMessageDelta(userId, cursor);
94
+ if (!result.ok) {
95
+ return result;
96
+ }
97
+ const pageData = result.value;
98
+ for (const message of pageData.value) {
99
+ await onMessage(message);
100
+ }
101
+ const nextLink = pageData['@odata.nextLink'];
102
+ if (nextLink) {
103
+ cursor = nextLink;
104
+ continue;
105
+ }
106
+ deltaLink = pageData['@odata.deltaLink'] ?? null;
107
+ return ok({ deltaLink });
108
+ }
109
+ return ok({ deltaLink: cursor ?? null });
110
+ }
111
+ function nonEmpty(value) {
112
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
113
+ }
114
+ //# sourceMappingURL=subscription-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-lifecycle.js","sourceRoot":"","sources":["../../src/graph/subscription-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,2BAA2B,CAAC;AAE/E,OAAO,EAEL,4BAA4B,EAC5B,4BAA4B,GAE7B,MAAM,mBAAmB,CAAC;AAmC3B,MAAM,UAAU,0BAA0B,CACxC,KAAmD;IAEnD,MAAM,KAAK,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,CAAC;AASD,MAAM,UAAU,iBAAiB,CAC/B,YAAqC,EACrC,mBAA2B;IAE3B,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC;IAC1C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,GAAG,CAAC,YAAY,CAAC,qBAAqB,EAAE,wCAAwC,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QACrC,OAAO,GAAG,CAAC,YAAY,CAAC,qBAAqB,EAAE,yCAAyC,CAAC,CAAC,CAAC;IAC7F,CAAC;IACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC;AAgBD,MAAM,UAAU,wBAAwB,CACtC,YAAqC;IAErC,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC;IACvC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,GAAG,CAAC,YAAY,CAAC,mBAAmB,EAAE,yCAAyC,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,GAAG,CACR,YAAY,CAAC,mBAAmB,EAAE,mDAAmD,QAAQ,GAAG,CAAC,CAClG,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GACb,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAClF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,GAAG,CACR,YAAY,CAAC,mBAAmB,EAAE,sDAAsD,QAAQ,GAAG,CAAC,CACrG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AACnC,CAAC;AAMD,SAAS,cAAc,CAAC,QAAgB,EAAE,OAAe;IACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC;QACtC,IAAI,GAAG,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YACjD,SAAS;QACX,CAAC;QAED,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AASD,MAAM,UAAU,YAAY,CAC1B,kBAA0B,EAC1B,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAE5B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,SAAS,GAAG,GAAG,IAAI,4BAA4B,CAAC;AACzD,CAAC;AAGD,MAAM,UAAU,cAAc,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE;IACrD,OAAO,IAAI,IAAI,CAAC,GAAG,GAAG,4BAA4B,CAAC,CAAC,WAAW,EAAE,CAAC;AACpE,CAAC;AAeD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAmB;IACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACxF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,CACR,YAAY,CAAC,mBAAmB,EAAE,uDAAuD,CAAC,CAC3F,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAmB,EACnB,KAA8B;IAE9B,OAAO,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAmB,EACnB,YAAkE,EAClE,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,kBAAkB,EAAE,GAAG,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAeD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAmB,EACnB,MAAc,EACd,SAA6B,EAC7B,SAA2D,EAC3D,QAAQ,GAAG,EAAE;IAEb,IAAI,MAAM,GAAG,SAAS,CAAC;IACvB,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;QAC9B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACrC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAC7C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,QAAQ,CAAC;YAClB,SAAS;QACX,CAAC;QACD,SAAS,GAAG,QAAQ,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC;QACjD,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3B,CAAC;IAGD,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "ms365-connector-install",
4
+ "title": "Microsoft 365 Mail Intake Settings",
5
+ "type": "object",
6
+ "required": ["integration", "mailboxUserId"],
7
+ "properties": {
8
+ "integration": {
9
+ "type": "string",
10
+ "title": "Microsoft 365 connection",
11
+ "description": "Which connected Microsoft 365 tenant this installation uses.",
12
+ "x-widget": "credential-picker",
13
+ "x-widget-config": { "provider": "microsoft_graph" }
14
+ },
15
+ "mailboxUserId": {
16
+ "type": "string",
17
+ "title": "Mailbox",
18
+ "description": "User id or UPN of the mailbox to monitor for inbound mail (e.g. intake@contoso.onmicrosoft.com)."
19
+ },
20
+ "folder": {
21
+ "type": "string",
22
+ "title": "Mail folder",
23
+ "description": "Well-known folder to subscribe to (default: inbox).",
24
+ "enum": ["inbox", "archive", "clutter", "junkemail"],
25
+ "default": "inbox"
26
+ }
27
+ }
28
+ }
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@xemahq/biomes-platform-ms365",
3
+ "version": "0.1.0",
4
+ "license": "LicenseRef-Xema-BSL-1.1",
5
+ "type": "module",
6
+ "publishConfig": {
7
+ "registry": "https://registry.npmjs.org/",
8
+ "access": "public"
9
+ },
10
+ "main": "dist/connector-adapters/index.js",
11
+ "files": [
12
+ "dist",
13
+ "install-schema",
14
+ "xema-biome.json",
15
+ "contributions"
16
+ ],
17
+ "exports": {
18
+ "./connector-adapters": {
19
+ "types": "./dist/connector-adapters/index.d.ts",
20
+ "default": "./dist/connector-adapters/index.js"
21
+ },
22
+ "./package.json": "./package.json"
23
+ },
24
+ "dependencies": {
25
+ "@xemahq/biome-sdk": "^3.0.0",
26
+ "@xemahq/kernel-contracts": "^5.1.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "25.2.3",
30
+ "typescript": "5.9.3"
31
+ },
32
+ "scripts": {
33
+ "build": "tsc -p tsconfig.json",
34
+ "typecheck": "tsc --noEmit",
35
+ "test": "node --test ./tests/**/*.test.mjs"
36
+ }
37
+ }