import { Observable } from '../Observable'; import { AsyncSubject } from '../AsyncSubject'; import { map } from '../operators/map'; import { canReportError } from '../util/canReportError'; import { isScheduler } from '../util/isScheduler'; import { isArray } from '../util/isArray'; export function bindNodeCallback(callbackFunc, resultSelector, scheduler) { if (resultSelector) { if (isScheduler(resultSelector)) { scheduler = resultSelector; } else { return (...args) => bindNodeCallback(callbackFunc, scheduler)(...args).pipe(map(args => isArray(args) ? resultSelector(...args) : resultSelector(args))); } } return function (...args) { const params = { subject: undefined, args, callbackFunc, scheduler, context: this, }; return new Observable(subscriber => { const { context } = params; let { subject } = params; if (!scheduler) { if (!subject) { subject = params.subject = new AsyncSubject(); const handler = (...innerArgs) => { const err = innerArgs.shift(); if (err) { subject.error(err); return; } subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); subject.complete(); }; try { callbackFunc.apply(context, [...args, handler]); } catch (err) { if (canReportError(subject)) { subject.error(err); } else { console.warn(err); } } } return subject.subscribe(subscriber); } else { return scheduler.schedule(dispatch, 0, { params, subscriber, context }); } }); }; } function dispatch(state) { const { params, subscriber, context } = state; const { callbackFunc, args, scheduler } = params; let subject = params.subject; if (!subject) { subject = params.subject = new AsyncSubject(); const handler = (...innerArgs) => { const err = innerArgs.shift(); if (err) { this.add(scheduler.schedule(dispatchError, 0, { err, subject })); } else { const value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; this.add(scheduler.schedule(dispatchNext, 0, { value, subject })); } }; try { callbackFunc.apply(context, [...args, handler]); } catch (err) { this.add(scheduler.schedule(dispatchError, 0, { err, subject })); } } this.add(subject.subscribe(subscriber)); } function dispatchNext(arg) { const { value, subject } = arg; subject.next(value); subject.complete(); } function dispatchError(arg) { const { err, subject } = arg; subject.error(err); } //# sourceMappingURL=bindNodeCallback.js.map