UNPKG

nylas

Version:

A NodeJS wrapper for the Nylas REST API for email, contacts, and calendar.

197 lines (196 loc) 7.34 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Messages = void 0; const formdata_node_1 = require("formdata-node"); const utils_js_1 = require("../utils.js"); const resource_js_1 = require("./resource.js"); const smartCompose_js_1 = require("./smartCompose.js"); /** * Nylas Messages API * * The Nylas Messages API allows you to list, find, update, delete, schedule, and send messages on user accounts. */ class Messages extends resource_js_1.Resource { constructor(apiClient) { super(apiClient); this.smartCompose = new smartCompose_js_1.SmartCompose(apiClient); } /** * Return all Messages * @return A list of messages */ list({ identifier, queryParams, overrides, }) { const modifiedQueryParams = queryParams ? { ...queryParams } : undefined; // Transform some query params that are arrays into comma-delimited strings if (modifiedQueryParams && queryParams) { if (Array.isArray(queryParams?.anyEmail)) { delete modifiedQueryParams.anyEmail; modifiedQueryParams['any_email'] = queryParams.anyEmail.join(','); } } return super._list({ queryParams: modifiedQueryParams, overrides, path: (0, utils_js_1.makePathParams)('/v3/grants/{identifier}/messages', { identifier }), }); } /** * Return a Message * @return The message */ find({ identifier, messageId, overrides, queryParams, }) { return super._find({ path: (0, utils_js_1.makePathParams)('/v3/grants/{identifier}/messages/{messageId}', { identifier, messageId, }), overrides, queryParams, }); } /** * Update a Message * @return The updated message */ update({ identifier, messageId, requestBody, overrides, }) { return super._update({ path: (0, utils_js_1.makePathParams)('/v3/grants/{identifier}/messages/{messageId}', { identifier, messageId, }), requestBody, overrides, }); } /** * Delete a Message * @return The deleted message */ destroy({ identifier, messageId, overrides, }) { return super._destroy({ path: (0, utils_js_1.makePathParams)('/v3/grants/{identifier}/messages/{messageId}', { identifier, messageId, }), overrides, }); } /** * Send an email * @return The sent message */ async send({ identifier, requestBody, overrides, }) { const path = (0, utils_js_1.makePathParams)('/v3/grants/{identifier}/messages/send', { identifier, }); const requestOptions = { method: 'POST', path, overrides, }; // Use form data if the total payload size (body + attachments) is greater than 3mb const totalPayloadSize = (0, utils_js_1.calculateTotalPayloadSize)(requestBody); if (totalPayloadSize >= Messages.MAXIMUM_JSON_ATTACHMENT_SIZE) { requestOptions.form = Messages._buildFormRequest(requestBody); } else { if (requestBody.attachments) { const processedAttachments = await (0, utils_js_1.encodeAttachmentContent)(requestBody.attachments); requestOptions.body = { ...requestBody, attachments: processedAttachments, }; } else { requestOptions.body = requestBody; } } return this.apiClient.request(requestOptions); } /** * Retrieve your scheduled messages * @return A list of scheduled messages */ listScheduledMessages({ identifier, overrides, }) { return super._find({ path: (0, utils_js_1.makePathParams)('/v3/grants/{identifier}/messages/schedules', { identifier, }), overrides, }); } /** * Retrieve a scheduled message * @return The scheduled message */ findScheduledMessage({ identifier, scheduleId, overrides, }) { return super._find({ path: (0, utils_js_1.makePathParams)('/v3/grants/{identifier}/messages/schedules/{scheduleId}', { identifier, scheduleId }), overrides, }); } /** * Stop a scheduled message * @return The confirmation of the stopped scheduled message */ stopScheduledMessage({ identifier, scheduleId, overrides, }) { return super._destroy({ path: (0, utils_js_1.makePathParams)('/v3/grants/{identifier}/messages/schedules/{scheduleId}', { identifier, scheduleId }), overrides, }); } /** * Remove extra information from a list of messages * @return The list of cleaned messages */ cleanMessages({ identifier, requestBody, overrides, }) { return this.apiClient.request({ method: 'PUT', path: (0, utils_js_1.makePathParams)('/v3/grants/{identifier}/messages/clean', { identifier, }), body: requestBody, overrides, }); } static _buildFormRequest(requestBody) { const form = new formdata_node_1.FormData(); // Split out the message payload from the attachments const messagePayload = { ...requestBody, attachments: undefined, }; form.append('message', JSON.stringify((0, utils_js_1.objKeysToSnakeCase)(messagePayload))); // Add a separate form field for each attachment if (requestBody.attachments && requestBody.attachments.length > 0) { requestBody.attachments.map((attachment, index) => { const contentId = attachment.contentId || `file${index}`; // Handle different content types for formdata-node if (typeof attachment.content === 'string') { // Base64 string - create a Blob const buffer = Buffer.from(attachment.content, 'base64'); const blob = new formdata_node_1.Blob([buffer], { type: attachment.contentType }); form.append(contentId, blob, attachment.filename); } else if (Buffer.isBuffer(attachment.content)) { // Buffer - create a Blob const blob = new formdata_node_1.Blob([attachment.content], { type: attachment.contentType, }); form.append(contentId, blob, attachment.filename); } else { // ReadableStream - create a proper file-like object according to formdata-node docs const file = (0, utils_js_1.attachmentStreamToFile)(attachment); form.append(contentId, file, attachment.filename); } }); } return form; } } exports.Messages = Messages; // The maximum size of an attachment that can be sent using json Messages.MAXIMUM_JSON_ATTACHMENT_SIZE = 3 * 1024 * 1024;