nylas
Version:
A NodeJS wrapper for the Nylas REST API for email, contacts, and calendar.
125 lines (124 loc) • 3.68 kB
JavaScript
/**
* Base class for Nylas API resources
*
* @ignore No public constructor or functions
*/
export class Resource {
/**
* @param apiClient client The configured Nylas API client
*/
constructor(apiClient) {
this.apiClient = apiClient;
}
async fetchList({ queryParams, path, overrides, }) {
const res = await this.apiClient.request({
method: 'GET',
path,
queryParams,
overrides,
});
if (queryParams?.limit) {
let entriesRemaining = queryParams.limit;
while (res.data.length != queryParams.limit) {
entriesRemaining = queryParams.limit - res.data.length;
if (!res.nextCursor) {
break;
}
const nextRes = await this.apiClient.request({
method: 'GET',
path,
queryParams: {
...queryParams,
limit: entriesRemaining,
pageToken: res.nextCursor,
},
overrides,
});
res.data = res.data.concat(nextRes.data);
res.requestId = nextRes.requestId;
res.nextCursor = nextRes.nextCursor;
}
}
return res;
}
async *listIterator(listParams) {
const first = await this.fetchList(listParams);
yield first;
let pageToken = first.nextCursor;
while (pageToken) {
const res = await this.fetchList({
...listParams,
queryParams: pageToken
? {
...listParams.queryParams,
pageToken,
}
: listParams.queryParams,
});
yield res;
pageToken = res.nextCursor;
}
return undefined;
}
_list(listParams) {
const iterator = this.listIterator(listParams);
const first = iterator.next().then((res) => ({
...res.value,
next: iterator.next.bind(iterator),
}));
return Object.assign(first, {
[Symbol.asyncIterator]: this.listIterator.bind(this, listParams),
});
}
_find({ path, queryParams, overrides, }) {
return this.apiClient.request({
method: 'GET',
path,
queryParams,
overrides,
});
}
payloadRequest(method, { path, queryParams, requestBody, overrides }) {
return this.apiClient.request({
method,
path,
queryParams,
body: requestBody,
overrides,
});
}
_create(params) {
return this.payloadRequest('POST', params);
}
_update(params) {
return this.payloadRequest('PUT', params);
}
_updatePatch(params) {
return this.payloadRequest('PATCH', params);
}
_destroy({ path, queryParams, requestBody, overrides, }) {
return this.apiClient.request({
method: 'DELETE',
path,
queryParams,
body: requestBody,
overrides,
});
}
_getRaw({ path, queryParams, overrides, }) {
return this.apiClient.requestRaw({
method: 'GET',
path,
queryParams,
overrides,
});
}
_getStream({ path, queryParams, overrides, }) {
return this.apiClient.requestStream({
method: 'GET',
path,
queryParams,
overrides,
});
}
}