UNPKG

couchbase

Version:

The official Couchbase Node.js Client Library.

139 lines (138 loc) 4.52 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.StreamableScanPromise = exports.StreamableReplicasPromise = exports.StreamableRowPromise = exports.StreamablePromise = void 0; /* eslint jsdoc/require-jsdoc: off */ const events_1 = __importDefault(require("events")); /** * @internal */ class StreamablePromise extends events_1.default { /** * @internal */ constructor(promisefyFn) { super(); this._promise = null; this._promiseOns = []; this._promise = new Promise((resolve, reject) => { promisefyFn({ on: (eventName, listener) => { this._promiseOns.push([eventName, listener]); super.on(eventName, listener); }, }, resolve, reject); }); } get promise() { if (!this._promise) { throw new Error('Cannot await a promise that is already registered for events'); } return this._promise; } _depromisify() { this._promiseOns.forEach((e) => this.off(...e)); this._promise = null; } then(onfulfilled, onrejected) { return this.promise.then(onfulfilled, onrejected); } catch(onrejected) { return this.promise.catch(onrejected); } finally(onfinally) { return this.promise.finally(onfinally); } addListener(eventName, listener) { this._depromisify(); return super.on(eventName, listener); } on(eventName, listener) { this._depromisify(); return super.on(eventName, listener); } /** * @internal */ get [Symbol.toStringTag]() { return Promise[Symbol.toStringTag]; } } exports.StreamablePromise = StreamablePromise; /** * Provides the ability to be used as either a promise or an event emitter. Enabling * an application to easily retrieve all results using async/await or enabling * streaming of results by listening for the row and meta events. */ class StreamableRowPromise extends StreamablePromise { constructor(fn) { super((emitter, resolve, reject) => { let err; const rows = []; let meta; emitter.on('row', (r) => rows.push(r)); emitter.on('meta', (m) => (meta = m)); emitter.on('error', (e) => (err = e)); emitter.on('end', () => { if (err) { return reject(err); } resolve(fn(rows, meta)); }); }); } } exports.StreamableRowPromise = StreamableRowPromise; /** * Provides the ability to be used as either a promise or an event emitter. Enabling * an application to easily retrieve all replicas using async/await or enabling * streaming of replicas by listening for the replica event. */ class StreamableReplicasPromise extends StreamablePromise { constructor(fn) { super((emitter, resolve, reject) => { let err; const replicas = []; emitter.on('replica', (r) => replicas.push(r)); emitter.on('error', (e) => (err = e)); emitter.on('end', () => { if (err) { return reject(err); } resolve(fn(replicas)); }); }); } } exports.StreamableReplicasPromise = StreamableReplicasPromise; /** * Provides the ability to be used as either a promise or an event emitter. Enabling * an application to easily retrieve all scan results using async/await or enabling * streaming of scan results by listening for the result event. */ class StreamableScanPromise extends StreamablePromise { constructor(fn) { super((emitter, resolve, reject) => { let err; const results = []; emitter.on('result', (r) => results.push(r)); emitter.on('error', (e) => (err = e)); emitter.on('end', () => { if (err) { return reject(err); } resolve(fn(results)); }); }); this._cancelRequested = false; } get cancelRequested() { return this._cancelRequested; } cancelStreaming() { this._cancelRequested = true; } } exports.StreamableScanPromise = StreamableScanPromise;