@xemahq/biomes-platform-ms365 0.7.0 → 0.8.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.
@@ -1,49 +0,0 @@
1
- export const DEFAULT_ATTACHMENT_SIZE_LIMIT = 5 * 1024 * 1024;
2
- const MIN_ATTACHMENT_SIZE_LIMIT = 1024;
3
- const MAX_ATTACHMENT_SIZE_LIMIT = 16 * 1024 * 1024;
4
- export function clampAttachmentSizeLimit(value) {
5
- if (typeof value !== 'number' || !Number.isFinite(value)) {
6
- return DEFAULT_ATTACHMENT_SIZE_LIMIT;
7
- }
8
- return Math.max(MIN_ATTACHMENT_SIZE_LIMIT, Math.min(MAX_ATTACHMENT_SIZE_LIMIT, Math.floor(value)));
9
- }
10
- export const FILE_ATTACHMENT_ODATA_TYPE = '#microsoft.graph.fileAttachment';
11
- export function collectAttachmentParts(attachments) {
12
- if (!Array.isArray(attachments)) {
13
- return [];
14
- }
15
- const out = [];
16
- for (const raw of attachments) {
17
- if (!raw || typeof raw !== 'object') {
18
- continue;
19
- }
20
- const odataType = raw['@odata.type'];
21
- if (odataType !== undefined && odataType !== FILE_ATTACHMENT_ODATA_TYPE) {
22
- continue;
23
- }
24
- const attachmentId = nonEmpty(raw.id);
25
- const filename = nonEmpty(raw.name);
26
- const contentType = nonEmpty(raw.contentType);
27
- if (!attachmentId || !filename || !contentType) {
28
- continue;
29
- }
30
- out.push({
31
- attachmentId,
32
- filename,
33
- contentType,
34
- size: typeof raw.size === 'number' && raw.size >= 0 ? raw.size : 0,
35
- ...optional('contentId', nonEmpty(raw.contentId)),
36
- });
37
- }
38
- return out;
39
- }
40
- export function nonEmpty(value) {
41
- return typeof value === 'string' && value.length > 0 ? value : undefined;
42
- }
43
- export function optional(key, value) {
44
- return value === undefined ? {} : { [key]: value };
45
- }
46
- export function optionalArray(key, value) {
47
- return value.length === 0 ? {} : { [key]: value };
48
- }
49
- //# sourceMappingURL=message-parts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"message-parts.js","sourceRoot":"","sources":["../../src/graph/message-parts.ts"],"names":[],"mappings":"AA0BA,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7D,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAMnD,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,OAAO,6BAA6B,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CACb,yBAAyB,EACzB,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,iCAAiC,CAAC;AA4B5E,MAAM,UAAU,sBAAsB,CACpC,WAAuD;IAEvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAA0B,EAAE,CAAC;IACtC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACpC,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;QACrC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,0BAA0B,EAAE,CAAC;YACxE,SAAS;QACX,CAAC;QACD,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/C,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC;YACP,YAAY;YACZ,QAAQ;YACR,WAAW;YACX,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClE,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;SAClD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,GAAM,EACN,KAAoB;IAEpB,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAmB,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,GAAM,EACN,KAAU;IAEV,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAqB,CAAC;AACxE,CAAC"}
@@ -1 +0,0 @@
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"}
@@ -1,114 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"subscription-lifecycle.js","sourceRoot":"","sources":["../../src/graph/subscription-lifecycle.ts"],"names":[],"mappings":"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"}