Files
stalwart_mcp/jmap_client.js

64 lines
2.2 KiB
JavaScript

import axios, {} from 'axios';
export class JMAPClient {
baseUrl;
username;
appPassword;
apiUrl = '';
accountId = '';
client;
constructor(baseUrl, username, appPassword) {
this.baseUrl = baseUrl;
this.username = username;
this.appPassword = appPassword;
const auth = Buffer.from(`${this.username}:${this.appPassword}`).toString('base64');
this.client = axios.create({
headers: {
'Authorization': `Basic ${auth}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
}
});
}
async connect() {
// Fetch session
// Stalwart redirects /.well-known/jmap to /jmap/session
const sessionUrl = this.baseUrl.endsWith('/') ? `${this.baseUrl}jmap/session` : `${this.baseUrl}/jmap/session`;
try {
const response = await this.client.get(sessionUrl);
const session = response.data;
// Fix for Stalwart behind proxy returning internal docker hostname in apiUrl
const parsedApiUrl = new URL(session.apiUrl);
const parsedBaseUrl = new URL(this.baseUrl);
parsedApiUrl.protocol = parsedBaseUrl.protocol;
parsedApiUrl.host = parsedBaseUrl.host;
this.apiUrl = parsedApiUrl.toString();
// Get the primary account for mail
this.accountId = session.primaryAccounts['urn:ietf:params:jmap:mail'];
if (!this.accountId) {
throw new Error("No primary mail account found in JMAP session.");
}
}
catch (error) {
console.error("Failed to connect to JMAP session:", error);
throw error;
}
}
async request(methodCalls) {
if (!this.apiUrl) {
await this.connect();
}
const payload = {
using: [
"urn:ietf:params:jmap:core",
"urn:ietf:params:jmap:mail"
],
methodCalls
};
const response = await this.client.post(this.apiUrl, payload);
return response.data;
}
getAccountId() {
return this.accountId;
}
}
//# sourceMappingURL=jmap_client.js.map