66 lines
2.3 KiB
JavaScript
66 lines
2.3 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;
|
|
parsedApiUrl.port = parsedBaseUrl.port;
|
|
this.apiUrl = parsedApiUrl.toString();
|
|
console.error("API URL set to:", this.apiUrl);
|
|
// 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
|