mailinator-client
Version:
Mailinator REST API client for JavaScript applications.
86 lines (85 loc) • 3.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports._resolveTemplateUrl = exports.StreamDomainMessagesRequest = void 0;
const WebSocket = require("ws");
const Constants_1 = require("../Constants");
const DEFAULT_BASE_URL = 'https://api.mailinator.com';
const _resolveTemplateUrl = (baseUrl, domain, full, limit, throttleInterval, del) => {
const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
const webSocketBaseUrl = normalizedBaseUrl
.replace(/^https:\/\//i, 'wss://')
.replace(/^http:\/\//i, 'ws://');
const url = new URL(`${webSocketBaseUrl}/api/v2/domains/${domain}/stream`);
if (full !== undefined) {
url.searchParams.set('full', full.toString());
}
if (limit !== undefined) {
url.searchParams.set('limit', limit.toString());
}
if (throttleInterval !== undefined) {
url.searchParams.set('throttleInterval', throttleInterval);
}
if (del !== undefined) {
url.searchParams.set('delete', del);
}
return url.toString();
};
exports._resolveTemplateUrl = _resolveTemplateUrl;
class StreamDomainMessagesRequest {
constructor(domain, full, limit, throttleInterval, del, options = {}) {
this.domain = domain;
this.full = full;
this.limit = limit;
this.throttleInterval = throttleInterval;
this.del = del;
this.options = options;
}
execute(apiToken, handlers) {
const url = _resolveTemplateUrl(this.options.baseUrl || DEFAULT_BASE_URL, this.domain, this.full, this.limit, this.throttleInterval, this.del);
const socket = this.options.webSocketFactory
? this.options.webSocketFactory(url, apiToken)
: new WebSocket(url, {
headers: {
[Constants_1.AUTHORIZATION]: apiToken
}
});
socket.on('open', () => {
if (handlers.onOpen) {
handlers.onOpen();
}
});
socket.on('message', (payload) => {
try {
const message = JSON.parse(payload.toString());
handlers.onMessage(message);
}
catch (error) {
if (handlers.onError) {
if (error instanceof Error) {
handlers.onError(error);
}
else {
handlers.onError(new Error('Failed to parse stream payload.'));
}
}
}
});
socket.on('error', (error) => {
if (handlers.onError) {
handlers.onError(error);
}
});
socket.on('close', (code, reason) => {
if (handlers.onClose) {
handlers.onClose(code, reason.toString());
}
});
return {
close: (code, reason) => {
socket.close(code, reason);
},
socket
};
}
}
exports.StreamDomainMessagesRequest = StreamDomainMessagesRequest;