UNPKG

facebook-nodejs-business-sdk

Version:

SDK for the Facebook Marketing API in Javascript and Node.js

76 lines (68 loc) 2.76 kB
/** * Copyright (c) 2017-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the license found in the * LICENSE file in the root directory of this source tree. * @flow */ import ServerEvent from './server-event'; import EventRequest from './event-request'; import EventResponse from './event-response'; export default class BatchProcessor { _batch_size: number _concurrent_requests: number constructor(batch_size: number, concurrent_requests: number) { this._batch_size = batch_size; this._concurrent_requests = concurrent_requests; } *processEventRequestsGenerator(event_requests: Array<EventRequest>): Generator<Array<Promise<EventResponse>>,void,EventRequest> { let start = 0; let end = this._concurrent_requests; let requests = event_requests.slice(start, end); while (requests.length > 0) { yield requests.map(request => request.execute()); start = end; end += this._concurrent_requests; requests = event_requests.slice(start, end); } return; } async processEventRequests(event_requests: Array<EventRequest>) { const generator = this.processEventRequestsGenerator(event_requests); while (true) { const batch = generator.next().value; if (!batch || batch.length === 0) { generator.return(); return; } await Promise.all(batch); } } *processEventsGenerator(event_request_to_clone: EventRequest, all_events: Array<ServerEvent>): Generator<Array<Promise<EventResponse>>,void,EventRequest> { let index = 0; while (index < all_events.length) { let event_requests = []; while (index < all_events.length && event_requests.length < this._concurrent_requests) { const event_request = event_request_to_clone.cloneWithoutEvents(); const events = all_events.slice(index, index + this._batch_size); event_request.setEvents(events); event_requests.push(event_request); index += this._batch_size; } yield event_requests.map(request => request.execute()); } return; } async processEvents(event_request_to_clone: EventRequest, all_events: Array<ServerEvent>) { const generator = this.processEventsGenerator(event_request_to_clone, all_events); while (true) { const batch = generator.next().value; if (!batch || batch.length === 0) { generator.return(); return; } await Promise.all(batch); } } }