{"version":3,"sources":["../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,YAAY,CAAC;AAKrC;;;GAGG;AACH,wBAAgB,OAAO,CACrB,UAAU,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,GACpD,MAAM,CAAC,WAAW,CA2DpB;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAEhE","file":"utils.d.ts","sourcesContent":["import * as _ from 'underscore';\nimport * as Router from 'koa-router';\nimport debug from 'debug';\n\nconst d = debug('ark7:router:utils');\n\n/**\n * Compose `middleware` returning a fully valid middleware comprised of all\n * those which are passed.\n */\nexport function compose(\n  middleware: Router.IMiddleware | Router.IMiddleware[],\n): Router.IMiddleware {\n  if (_.isFunction(middleware)) {\n    return middleware;\n  }\n\n  if (!Array.isArray(middleware)) {\n    throw new TypeError('Middleware stack must be an array!');\n  }\n\n  for (const fn of middleware) {\n    if (typeof fn !== 'function') {\n      throw new TypeError('Middleware must be composed of functions!');\n    }\n  }\n\n  /**\n   * @param {Object} context\n   * @return {Promise}\n   * @api public\n   */\n\n  return function (context: any, next: Function) {\n    // last called middleware #\n    let index = -1;\n    const rid = `${context.request.method} ${context.request.path} ${context.requestId}`;\n\n    return dispatch.call(this, 0);\n\n    function dispatch(i: number) {\n      if (i <= index) {\n        return Promise.reject(new Error('next() called multiple times'));\n      }\n\n      index = i;\n\n      const fn = i === middleware.length ? next : (middleware as Function[])[i];\n\n      if (!fn) return Promise.resolve();\n\n      const start = _.now();\n      const name = fn.name || '<anonymous>';\n\n      try {\n        if (name !== 'bound dispatch') {\n          d('[%O] Begin of middleware %O', rid, name);\n        }\n        return Promise.resolve(\n          fn.call(this, context, dispatch.bind(this, i + 1)),\n        );\n      } catch (err) {\n        return Promise.reject(err);\n      } finally {\n        const end = _.now();\n        if (name !== 'bound dispatch') {\n          d('[%O] End of middleware %O, duration: %O', rid, name, end - start);\n        }\n      }\n    }\n  };\n}\n\nexport function isPromise<T>(promise: any): promise is Promise<T> {\n  return promise && promise.then != null;\n}\n"],"sourceRoot":"/Users/yz/workspace/router/src"}