aboutsummaryrefslogtreecommitdiff
path: root/node_modules/koa-connect/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/koa-connect/index.js')
-rw-r--r--node_modules/koa-connect/index.js38
1 files changed, 38 insertions, 0 deletions
diff --git a/node_modules/koa-connect/index.js b/node_modules/koa-connect/index.js
new file mode 100644
index 00000000..20139f1e
--- /dev/null
+++ b/node_modules/koa-connect/index.js
@@ -0,0 +1,38 @@
+/**
+ * If the middleware function does declare receiving the `next` callback
+ * assume that it's synchronous and invoke `next` ourselves
+ */
+function noCallbackHandler(ctx, connectMiddleware, next) {
+ connectMiddleware(ctx.req, ctx.res)
+ return next()
+}
+
+/**
+ * The middleware function does include the `next` callback so only resolve
+ * the Promise when it's called. If it's never called, the middleware stack
+ * completion will stall
+ */
+function withCallbackHandler(ctx, connectMiddleware, next) {
+ return new Promise((resolve, reject) => {
+ connectMiddleware(ctx.req, ctx.res, err => {
+ if (err) reject(err)
+ else resolve(next())
+ })
+ })
+}
+
+/**
+ * Returns a Koa middleware function that varies its async logic based on if the
+ * given middleware function declares at least 3 parameters, i.e. includes
+ * the `next` callback function
+ */
+function koaConnect(connectMiddleware) {
+ const handler = connectMiddleware.length < 3
+ ? noCallbackHandler
+ : withCallbackHandler
+ return function koaConnect(ctx, next) {
+ return handler(ctx, connectMiddleware, next)
+ }
+}
+
+module.exports = koaConnect