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