                              (if async?
                                (get options :sync-wrapper default-sync-wrapper)
                                default-namespace-middleware)))
-        handler (->> routing-table
-                     construct-dispatch-map
-                     (create-map-traversal-handler
-                       (if async? closed-channel)))]
+        handler (->>
+                  routing-table
+                  vals
+                  (apply concat)
+                  construct-dispatch-map
+                  (create-map-traversal-handler
+                    (if async? closed-channel)))]
     [handler routing-table]))
           doall))))

(defn- construct-routing-table
  "Expands the output of [[build-namespace-table]], converting each namespace entry into
  a series of entries:

      [method path handler endpoint-meta route-params]


                                          (assoc m term i)
                                          m))
                                      {}
                                      path)
              ;; Only these two keys are needed by the map traversal dispatcher, so there's no reason to keep
              ;; the full metdata of the endpoint.
              endpoint-meta' (select-keys endpoint-meta [:function :match])]
          (update-in dispatch-map path'
                     conj' [handler endpoint-meta' route-params])))
      {}
      routing-specs)))

(defn- endpoint-filter
  [request [_ {endpoint-matcher :match}]]
