vulcan 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (627) hide show
  1. data/lib/vulcan/version.rb +1 -1
  2. data/server/Procfile +1 -0
  3. data/server/bin/make +39 -0
  4. data/server/lib/on.js +13 -0
  5. data/server/lib/spawner.js +101 -0
  6. data/server/node_modules/connect-form/History.md +28 -0
  7. data/server/node_modules/connect-form/LICENSE +22 -0
  8. data/server/node_modules/connect-form/Makefile +11 -0
  9. data/server/node_modules/connect-form/Readme.md +35 -0
  10. data/server/node_modules/connect-form/index.html +213 -0
  11. data/server/node_modules/connect-form/index.js +100 -0
  12. data/server/node_modules/connect-form/lib/connect-form.js +100 -0
  13. data/server/node_modules/connect-form/node_modules/formidable/Makefile +14 -0
  14. data/server/node_modules/connect-form/node_modules/formidable/Readme.md +264 -0
  15. data/server/node_modules/connect-form/node_modules/formidable/TODO +3 -0
  16. data/server/node_modules/connect-form/node_modules/formidable/benchmark/bench-multipart-parser.js +70 -0
  17. data/server/node_modules/connect-form/node_modules/formidable/example/post.js +43 -0
  18. data/server/node_modules/connect-form/node_modules/formidable/example/upload.js +48 -0
  19. data/server/node_modules/connect-form/node_modules/formidable/index.js +1 -0
  20. data/server/node_modules/connect-form/node_modules/formidable/lib/file.js +61 -0
  21. data/server/node_modules/connect-form/node_modules/formidable/lib/incoming_form.js +362 -0
  22. data/server/node_modules/connect-form/node_modules/formidable/lib/index.js +3 -0
  23. data/server/node_modules/connect-form/node_modules/formidable/lib/multipart_parser.js +301 -0
  24. data/server/node_modules/connect-form/node_modules/formidable/lib/querystring_parser.js +25 -0
  25. data/server/node_modules/connect-form/node_modules/formidable/lib/util.js +6 -0
  26. data/server/node_modules/connect-form/node_modules/formidable/package.json +19 -0
  27. data/server/node_modules/connect-form/node_modules/formidable/test/common.js +20 -0
  28. data/server/node_modules/connect-form/node_modules/formidable/test/fast/test-incoming-form.js +45 -0
  29. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/file/: // ? % * | /" < > . /342/230/203 ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt" +1 -0
  30. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md +3 -0
  31. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-chrome-13.http +36 -0
  32. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-firefox-3.6.http +24 -0
  33. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/osx-safari-5.http +23 -0
  34. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-chrome-12.http +33 -0
  35. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-7.http +22 -0
  36. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-ie-8.http +22 -0
  37. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/http/special-chars-in-filename/xp-safari-5.http +22 -0
  38. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/js/special-chars-in-filename.js +21 -0
  39. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/multi_video.upload +0 -0
  40. data/server/node_modules/connect-form/node_modules/formidable/test/fixture/multipart.js +72 -0
  41. data/server/node_modules/connect-form/node_modules/formidable/test/legacy/common.js +24 -0
  42. data/server/node_modules/connect-form/node_modules/formidable/test/legacy/integration/test-multipart-parser.js +80 -0
  43. data/server/node_modules/connect-form/node_modules/formidable/test/legacy/simple/test-file.js +104 -0
  44. data/server/node_modules/connect-form/node_modules/formidable/test/legacy/simple/test-incoming-form.js +715 -0
  45. data/server/node_modules/connect-form/node_modules/formidable/test/legacy/simple/test-multipart-parser.js +50 -0
  46. data/server/node_modules/connect-form/node_modules/formidable/test/legacy/simple/test-querystring-parser.js +45 -0
  47. data/server/node_modules/connect-form/node_modules/formidable/test/legacy/system/test-multi-video-upload.js +72 -0
  48. data/server/node_modules/connect-form/node_modules/formidable/test/run.js +7 -0
  49. data/server/node_modules/connect-form/node_modules/formidable/test/slow/test-fixtures.js +84 -0
  50. data/server/node_modules/connect-form/node_modules/formidable/tool/record.js +47 -0
  51. data/server/node_modules/connect-form/package.json +9 -0
  52. data/server/node_modules/connect-form/support/connect/History.md +120 -0
  53. data/server/node_modules/connect-form/support/connect/Makefile +85 -0
  54. data/server/node_modules/connect-form/support/connect/README.md +121 -0
  55. data/server/node_modules/connect-form/support/connect/benchmarks/graph +79 -0
  56. data/server/node_modules/connect-form/support/connect/benchmarks/hello-world/connect.js +19 -0
  57. data/server/node_modules/connect-form/support/connect/benchmarks/hello-world/node.js +16 -0
  58. data/server/node_modules/connect-form/support/connect/benchmarks/hello-world/rack.thin.ru +9 -0
  59. data/server/node_modules/connect-form/support/connect/benchmarks/hello-world/sinatra.thin.ru +10 -0
  60. data/server/node_modules/connect-form/support/connect/benchmarks/public/jquery.js +19 -0
  61. data/server/node_modules/connect-form/support/connect/benchmarks/run +60 -0
  62. data/server/node_modules/connect-form/support/connect/benchmarks/static/connect.js +10 -0
  63. data/server/node_modules/connect-form/support/connect/benchmarks/static/node.js +17 -0
  64. data/server/node_modules/connect-form/support/connect/benchmarks/static/sinatra.thin.ru +10 -0
  65. data/server/node_modules/connect-form/support/connect/docs/api.html +1973 -0
  66. data/server/node_modules/connect-form/support/connect/docs/bodyDecoder.1 +27 -0
  67. data/server/node_modules/connect-form/support/connect/docs/bodyDecoder.html +164 -0
  68. data/server/node_modules/connect-form/support/connect/docs/bodyDecoder.md +11 -0
  69. data/server/node_modules/connect-form/support/connect/docs/compiler.1 +66 -0
  70. data/server/node_modules/connect-form/support/connect/docs/compiler.html +193 -0
  71. data/server/node_modules/connect-form/support/connect/docs/compiler.md +32 -0
  72. data/server/node_modules/connect-form/support/connect/docs/conditionalGet.1 +16 -0
  73. data/server/node_modules/connect-form/support/connect/docs/conditionalGet.html +158 -0
  74. data/server/node_modules/connect-form/support/connect/docs/conditionalGet.md +7 -0
  75. data/server/node_modules/connect-form/support/connect/docs/cookieDecoder.1 +27 -0
  76. data/server/node_modules/connect-form/support/connect/docs/cookieDecoder.html +164 -0
  77. data/server/node_modules/connect-form/support/connect/docs/cookieDecoder.md +11 -0
  78. data/server/node_modules/connect-form/support/connect/docs/errorHandler.1 +58 -0
  79. data/server/node_modules/connect-form/support/connect/docs/errorHandler.html +181 -0
  80. data/server/node_modules/connect-form/support/connect/docs/errorHandler.md +28 -0
  81. data/server/node_modules/connect-form/support/connect/docs/format.1 +7 -0
  82. data/server/node_modules/connect-form/support/connect/docs/format.html +152 -0
  83. data/server/node_modules/connect-form/support/connect/docs/format.md +3 -0
  84. data/server/node_modules/connect-form/support/connect/docs/index.1 +260 -0
  85. data/server/node_modules/connect-form/support/connect/docs/index.html +332 -0
  86. data/server/node_modules/connect-form/support/connect/docs/index.md +171 -0
  87. data/server/node_modules/connect-form/support/connect/docs/jsonrpc.1 +62 -0
  88. data/server/node_modules/connect-form/support/connect/docs/jsonrpc.html +192 -0
  89. data/server/node_modules/connect-form/support/connect/docs/jsonrpc.md +39 -0
  90. data/server/node_modules/connect-form/support/connect/docs/layout/api.foot.html +3 -0
  91. data/server/node_modules/connect-form/support/connect/docs/layout/api.head.html +142 -0
  92. data/server/node_modules/connect-form/support/connect/docs/lint.1 +102 -0
  93. data/server/node_modules/connect-form/support/connect/docs/lint.html +232 -0
  94. data/server/node_modules/connect-form/support/connect/docs/lint.md +79 -0
  95. data/server/node_modules/connect-form/support/connect/docs/logger.1 +66 -0
  96. data/server/node_modules/connect-form/support/connect/docs/logger.html +184 -0
  97. data/server/node_modules/connect-form/support/connect/docs/logger.md +31 -0
  98. data/server/node_modules/connect-form/support/connect/docs/methodOverride.1 +31 -0
  99. data/server/node_modules/connect-form/support/connect/docs/methodOverride.html +171 -0
  100. data/server/node_modules/connect-form/support/connect/docs/methodOverride.md +17 -0
  101. data/server/node_modules/connect-form/support/connect/docs/responseTime.1 +7 -0
  102. data/server/node_modules/connect-form/support/connect/docs/responseTime.html +152 -0
  103. data/server/node_modules/connect-form/support/connect/docs/responseTime.md +3 -0
  104. data/server/node_modules/connect-form/support/connect/docs/router.1 +75 -0
  105. data/server/node_modules/connect-form/support/connect/docs/router.html +211 -0
  106. data/server/node_modules/connect-form/support/connect/docs/router.md +58 -0
  107. data/server/node_modules/connect-form/support/connect/docs/session.1 +115 -0
  108. data/server/node_modules/connect-form/support/connect/docs/session.html +214 -0
  109. data/server/node_modules/connect-form/support/connect/docs/session.md +55 -0
  110. data/server/node_modules/connect-form/support/connect/docs/staticProvider.1 +28 -0
  111. data/server/node_modules/connect-form/support/connect/docs/staticProvider.html +162 -0
  112. data/server/node_modules/connect-form/support/connect/docs/staticProvider.md +11 -0
  113. data/server/node_modules/connect-form/support/connect/examples/error/app.js +13 -0
  114. data/server/node_modules/connect-form/support/connect/examples/jsonrpc/app.js +38 -0
  115. data/server/node_modules/connect-form/support/connect/examples/less/app.js +21 -0
  116. data/server/node_modules/connect-form/support/connect/examples/less/public/index.html +8 -0
  117. data/server/node_modules/connect-form/support/connect/examples/less/public/style.less +8 -0
  118. data/server/node_modules/connect-form/support/connect/examples/lint/app.js +40 -0
  119. data/server/node_modules/connect-form/support/connect/examples/multitouch/app.js +61 -0
  120. data/server/node_modules/connect-form/support/connect/examples/multitouch/public/client.js +73 -0
  121. data/server/node_modules/connect-form/support/connect/examples/multitouch/public/favicon.ico +0 -0
  122. data/server/node_modules/connect-form/support/connect/examples/multitouch/public/index.html +16 -0
  123. data/server/node_modules/connect-form/support/connect/examples/multitouch/public/raphael.js +113 -0
  124. data/server/node_modules/connect-form/support/connect/examples/multitouch/public/style.css +23 -0
  125. data/server/node_modules/connect-form/support/connect/examples/router/app.js +63 -0
  126. data/server/node_modules/connect-form/support/connect/examples/sass/app.js +21 -0
  127. data/server/node_modules/connect-form/support/connect/examples/sass/public/index.html +8 -0
  128. data/server/node_modules/connect-form/support/connect/examples/sass/public/style.sass +4 -0
  129. data/server/node_modules/connect-form/support/connect/examples/session/app.js +60 -0
  130. data/server/node_modules/connect-form/support/connect/examples/stack-middleware/app.js +15 -0
  131. data/server/node_modules/connect-form/support/connect/examples/stack-middleware/hello.js +13 -0
  132. data/server/node_modules/connect-form/support/connect/examples/stack-middleware/world.js +13 -0
  133. data/server/node_modules/connect-form/support/connect/examples/static/app.js +10 -0
  134. data/server/node_modules/connect-form/support/connect/examples/static/public/style.css +3 -0
  135. data/server/node_modules/connect-form/support/connect/examples/url-rewrite/app.js +44 -0
  136. data/server/node_modules/connect-form/support/connect/examples/vhost/app.js +25 -0
  137. data/server/node_modules/connect-form/support/connect/install.sh +6 -0
  138. data/server/node_modules/connect-form/support/connect/lib/connect/index.js +309 -0
  139. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/bodyDecoder.js +69 -0
  140. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/cache.js +142 -0
  141. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/cacheManifest.js +71 -0
  142. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/compiler.js +150 -0
  143. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/conditionalGet.js +71 -0
  144. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/cookieDecoder.js +37 -0
  145. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/errorHandler.js +91 -0
  146. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/format.js +46 -0
  147. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/gzip-compress.js +79 -0
  148. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/gzip-proc.js +73 -0
  149. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/gzip.js +8 -0
  150. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/jsonrpc.js +235 -0
  151. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/lint.js +136 -0
  152. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/logger.js +107 -0
  153. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/methodOverride.js +54 -0
  154. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/pubsub.js +107 -0
  155. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/repl.js +43 -0
  156. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/responseTime.js +28 -0
  157. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/router.js +158 -0
  158. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/session.js +129 -0
  159. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/session/memory.js +141 -0
  160. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/session/session.js +71 -0
  161. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/session/store.js +59 -0
  162. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/staticProvider.js +144 -0
  163. data/server/node_modules/connect-form/support/connect/lib/connect/middleware/vhost.js +43 -0
  164. data/server/node_modules/connect-form/support/connect/lib/connect/public/error.html +13 -0
  165. data/server/node_modules/connect-form/support/connect/lib/connect/public/style.css +98 -0
  166. data/server/node_modules/connect-form/support/connect/lib/connect/response.js +56 -0
  167. data/server/node_modules/connect-form/support/connect/lib/connect/utils.js +428 -0
  168. data/server/node_modules/connect-form/support/connect/package.json +21 -0
  169. data/server/node_modules/connect-form/support/connect/support/highlight.js +26 -0
  170. data/server/node_modules/connect-form/support/connect/test/bodyDecoder.test.js +69 -0
  171. data/server/node_modules/connect-form/support/connect/test/compiler.test.js +23 -0
  172. data/server/node_modules/connect-form/support/connect/test/connect.test.js +187 -0
  173. data/server/node_modules/connect-form/support/connect/test/cookieDecoder.test.js +31 -0
  174. data/server/node_modules/connect-form/support/connect/test/errorHandler.test.js +60 -0
  175. data/server/node_modules/connect-form/support/connect/test/filters/uppercase.js +14 -0
  176. data/server/node_modules/connect-form/support/connect/test/fixtures/foo.bar.baz.sass +2 -0
  177. data/server/node_modules/connect-form/support/connect/test/fixtures/index.html +1 -0
  178. data/server/node_modules/connect-form/support/connect/test/fixtures/some text.txt +1 -0
  179. data/server/node_modules/connect-form/support/connect/test/fixtures/style.less +2 -0
  180. data/server/node_modules/connect-form/support/connect/test/fixtures/style.sass +3 -0
  181. data/server/node_modules/connect-form/support/connect/test/fixtures/user.json +4 -0
  182. data/server/node_modules/connect-form/support/connect/test/format.test.js +37 -0
  183. data/server/node_modules/connect-form/support/connect/test/gzip.test.js +55 -0
  184. data/server/node_modules/connect-form/support/connect/test/helpers/http.js +87 -0
  185. data/server/node_modules/connect-form/support/connect/test/helpers/index.js +12 -0
  186. data/server/node_modules/connect-form/support/connect/test/jsonrpc.test.js +225 -0
  187. data/server/node_modules/connect-form/support/connect/test/logger.test.js +52 -0
  188. data/server/node_modules/connect-form/support/connect/test/methodOverride.test.js +69 -0
  189. data/server/node_modules/connect-form/support/connect/test/providers/echo.js +10 -0
  190. data/server/node_modules/connect-form/support/connect/test/responseTime.test.js +29 -0
  191. data/server/node_modules/connect-form/support/connect/test/router.test.js +154 -0
  192. data/server/node_modules/connect-form/support/connect/test/session.test.js +127 -0
  193. data/server/node_modules/connect-form/support/connect/test/static.test.js +66 -0
  194. data/server/node_modules/connect-form/support/connect/test/utils.test.js +65 -0
  195. data/server/node_modules/connect-form/support/connect/test/vhost.test.js +46 -0
  196. data/server/node_modules/connect-form/support/expresso/History.md +54 -0
  197. data/server/node_modules/connect-form/support/expresso/Makefile +30 -0
  198. data/server/node_modules/connect-form/support/expresso/Readme.md +208 -0
  199. data/server/node_modules/connect-form/support/expresso/bin/expresso +647 -0
  200. data/server/node_modules/connect-form/support/expresso/lib/bar.js +4 -0
  201. data/server/node_modules/connect-form/support/expresso/lib/foo.js +16 -0
  202. data/server/node_modules/connect-form/support/expresso/package.json +9 -0
  203. data/server/node_modules/connect-form/support/expresso/seed.yml +6 -0
  204. data/server/node_modules/connect-form/support/expresso/test/assert.test.js +64 -0
  205. data/server/node_modules/connect-form/support/expresso/test/bar.test.js +12 -0
  206. data/server/node_modules/connect-form/support/expresso/test/foo.test.js +13 -0
  207. data/server/node_modules/connect-form/support/expresso/test/http.test.js +61 -0
  208. data/server/node_modules/connect-form/test/form.test.js +148 -0
  209. data/server/node_modules/cradle/LICENSE +20 -0
  210. data/server/node_modules/cradle/Makefile +10 -0
  211. data/server/node_modules/cradle/README.md +377 -0
  212. data/server/node_modules/cradle/lib/cradle.js +688 -0
  213. data/server/node_modules/cradle/lib/cradle/cache.js +102 -0
  214. data/server/node_modules/cradle/lib/cradle/response.js +127 -0
  215. data/server/node_modules/cradle/node_modules/vargs/LICENSE +20 -0
  216. data/server/node_modules/cradle/node_modules/vargs/README.md +34 -0
  217. data/server/node_modules/cradle/node_modules/vargs/lib/vargs.js +70 -0
  218. data/server/node_modules/cradle/node_modules/vargs/package.json +12 -0
  219. data/server/node_modules/cradle/node_modules/vows/LICENSE +20 -0
  220. data/server/node_modules/cradle/node_modules/vows/Makefile +7 -0
  221. data/server/node_modules/cradle/node_modules/vows/README.md +39 -0
  222. data/server/node_modules/cradle/node_modules/vows/bin/vows +515 -0
  223. data/server/node_modules/cradle/node_modules/vows/lib/assert/error.js +27 -0
  224. data/server/node_modules/cradle/node_modules/vows/lib/assert/macros.js +215 -0
  225. data/server/node_modules/cradle/node_modules/vows/lib/assert/utils.js +77 -0
  226. data/server/node_modules/cradle/node_modules/vows/lib/vows.js +193 -0
  227. data/server/node_modules/cradle/node_modules/vows/lib/vows/console.js +131 -0
  228. data/server/node_modules/cradle/node_modules/vows/lib/vows/context.js +55 -0
  229. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/file.js +29 -0
  230. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/fragments/coverage-foot.html +2 -0
  231. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/fragments/coverage-head.html +61 -0
  232. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-html.js +54 -0
  233. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-json.js +54 -0
  234. data/server/node_modules/cradle/node_modules/vows/lib/vows/coverage/report-plain.js +38 -0
  235. data/server/node_modules/cradle/node_modules/vows/lib/vows/extras.js +28 -0
  236. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/dot-matrix.js +67 -0
  237. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/json.js +16 -0
  238. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/silent.js +8 -0
  239. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/spec.js +44 -0
  240. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/watch.js +39 -0
  241. data/server/node_modules/cradle/node_modules/vows/lib/vows/reporters/xunit.js +90 -0
  242. data/server/node_modules/cradle/node_modules/vows/lib/vows/suite.js +319 -0
  243. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/LICENSE +20 -0
  244. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/Makefile +4 -0
  245. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/README.md +72 -0
  246. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/lib/eyes.js +233 -0
  247. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/package.json +14 -0
  248. data/server/node_modules/cradle/node_modules/vows/node_modules/eyes/test/eyes-test.js +55 -0
  249. data/server/node_modules/cradle/node_modules/vows/package.json +14 -0
  250. data/server/node_modules/cradle/node_modules/vows/test/assert-test.js +135 -0
  251. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/failing.js +18 -0
  252. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/log.js +18 -0
  253. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/passing.js +17 -0
  254. data/server/node_modules/cradle/node_modules/vows/test/fixtures/isolate/stderr.js +18 -0
  255. data/server/node_modules/cradle/node_modules/vows/test/isolate-test.js +140 -0
  256. data/server/node_modules/cradle/node_modules/vows/test/testInherit.js +133 -0
  257. data/server/node_modules/cradle/node_modules/vows/test/vows-error-test.js +51 -0
  258. data/server/node_modules/cradle/node_modules/vows/test/vows-test.js +374 -0
  259. data/server/node_modules/cradle/package.json +14 -0
  260. data/server/node_modules/cradle/test/cache-test.js +102 -0
  261. data/server/node_modules/cradle/test/cradle-test.js +651 -0
  262. data/server/node_modules/cradle/test/fixtures/databases.json +25 -0
  263. data/server/node_modules/cradle/test/helpers/seed.js +56 -0
  264. data/server/node_modules/cradle/test/response-test.js +73 -0
  265. data/server/node_modules/express/History.md +743 -0
  266. data/server/node_modules/express/LICENSE +22 -0
  267. data/server/node_modules/express/Makefile +35 -0
  268. data/server/node_modules/express/Readme.md +143 -0
  269. data/server/node_modules/express/bin/express +417 -0
  270. data/server/node_modules/express/index.js +2 -0
  271. data/server/node_modules/express/lib/express.js +79 -0
  272. data/server/node_modules/express/lib/http.js +583 -0
  273. data/server/node_modules/express/lib/https.js +52 -0
  274. data/server/node_modules/express/lib/request.js +309 -0
  275. data/server/node_modules/express/lib/response.js +459 -0
  276. data/server/node_modules/express/lib/router/collection.js +53 -0
  277. data/server/node_modules/express/lib/router/index.js +398 -0
  278. data/server/node_modules/express/lib/router/methods.js +70 -0
  279. data/server/node_modules/express/lib/router/route.js +88 -0
  280. data/server/node_modules/express/lib/utils.js +139 -0
  281. data/server/node_modules/express/lib/view.js +457 -0
  282. data/server/node_modules/express/lib/view/partial.js +40 -0
  283. data/server/node_modules/express/lib/view/view.js +209 -0
  284. data/server/node_modules/express/node_modules/connect/LICENSE +24 -0
  285. data/server/node_modules/express/node_modules/connect/index.js +2 -0
  286. data/server/node_modules/express/node_modules/connect/lib/cache.js +81 -0
  287. data/server/node_modules/express/node_modules/connect/lib/connect.js +106 -0
  288. data/server/node_modules/express/node_modules/connect/lib/http.js +215 -0
  289. data/server/node_modules/express/node_modules/connect/lib/https.js +47 -0
  290. data/server/node_modules/express/node_modules/connect/lib/index.js +46 -0
  291. data/server/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js +93 -0
  292. data/server/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js +92 -0
  293. data/server/node_modules/express/node_modules/connect/lib/middleware/compiler.js +163 -0
  294. data/server/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js +46 -0
  295. data/server/node_modules/express/node_modules/connect/lib/middleware/csrf.js +105 -0
  296. data/server/node_modules/express/node_modules/connect/lib/middleware/directory.js +222 -0
  297. data/server/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js +100 -0
  298. data/server/node_modules/express/node_modules/connect/lib/middleware/favicon.js +76 -0
  299. data/server/node_modules/express/node_modules/connect/lib/middleware/limit.js +78 -0
  300. data/server/node_modules/express/node_modules/connect/lib/middleware/logger.js +299 -0
  301. data/server/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js +38 -0
  302. data/server/node_modules/express/node_modules/connect/lib/middleware/profiler.js +100 -0
  303. data/server/node_modules/express/node_modules/connect/lib/middleware/query.js +40 -0
  304. data/server/node_modules/express/node_modules/connect/lib/middleware/responseTime.js +34 -0
  305. data/server/node_modules/express/node_modules/connect/lib/middleware/router.js +379 -0
  306. data/server/node_modules/express/node_modules/connect/lib/middleware/session.js +346 -0
  307. data/server/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js +126 -0
  308. data/server/node_modules/express/node_modules/connect/lib/middleware/session/memory.js +131 -0
  309. data/server/node_modules/express/node_modules/connect/lib/middleware/session/session.js +137 -0
  310. data/server/node_modules/express/node_modules/connect/lib/middleware/session/store.js +87 -0
  311. data/server/node_modules/express/node_modules/connect/lib/middleware/static.js +220 -0
  312. data/server/node_modules/express/node_modules/connect/lib/middleware/staticCache.js +122 -0
  313. data/server/node_modules/express/node_modules/connect/lib/middleware/vhost.js +44 -0
  314. data/server/node_modules/express/node_modules/connect/lib/patch.js +79 -0
  315. data/server/node_modules/express/node_modules/connect/lib/public/directory.html +75 -0
  316. data/server/node_modules/express/node_modules/connect/lib/public/error.html +13 -0
  317. data/server/node_modules/express/node_modules/connect/lib/public/favicon.ico +0 -0
  318. data/server/node_modules/express/node_modules/connect/lib/public/icons/page.png +0 -0
  319. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_add.png +0 -0
  320. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_attach.png +0 -0
  321. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_code.png +0 -0
  322. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_copy.png +0 -0
  323. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_delete.png +0 -0
  324. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_edit.png +0 -0
  325. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_error.png +0 -0
  326. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_excel.png +0 -0
  327. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_find.png +0 -0
  328. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_gear.png +0 -0
  329. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_go.png +0 -0
  330. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_green.png +0 -0
  331. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_key.png +0 -0
  332. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png +0 -0
  333. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_link.png +0 -0
  334. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png +0 -0
  335. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_paste.png +0 -0
  336. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_red.png +0 -0
  337. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png +0 -0
  338. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_save.png +0 -0
  339. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white.png +0 -0
  340. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png +0 -0
  341. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png +0 -0
  342. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_add.png +0 -0
  343. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_c.png +0 -0
  344. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_camera.png +0 -0
  345. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_cd.png +0 -0
  346. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png +0 -0
  347. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png +0 -0
  348. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png +0 -0
  349. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_compressed.png +0 -0
  350. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png +0 -0
  351. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_cplusplus.png +0 -0
  352. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_csharp.png +0 -0
  353. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_cup.png +0 -0
  354. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_database.png +0 -0
  355. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_delete.png +0 -0
  356. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_dvd.png +0 -0
  357. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png +0 -0
  358. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_error.png +0 -0
  359. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png +0 -0
  360. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png +0 -0
  361. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_flash.png +0 -0
  362. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png +0 -0
  363. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png +0 -0
  364. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png +0 -0
  365. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_go.png +0 -0
  366. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_h.png +0 -0
  367. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_horizontal.png +0 -0
  368. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png +0 -0
  369. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_lightning.png +0 -0
  370. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png +0 -0
  371. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png +0 -0
  372. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_medal.png +0 -0
  373. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png +0 -0
  374. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png +0 -0
  375. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_paintbrush.png +0 -0
  376. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_paste.png +0 -0
  377. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_php.png +0 -0
  378. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png +0 -0
  379. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png +0 -0
  380. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_put.png +0 -0
  381. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png +0 -0
  382. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png +0 -0
  383. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png +0 -0
  384. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png +0 -0
  385. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_text.png +0 -0
  386. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_text_width.png +0 -0
  387. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_tux.png +0 -0
  388. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_vector.png +0 -0
  389. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_visualstudio.png +0 -0
  390. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png +0 -0
  391. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png +0 -0
  392. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png +0 -0
  393. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png +0 -0
  394. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png +0 -0
  395. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_word.png +0 -0
  396. data/server/node_modules/express/node_modules/connect/lib/public/icons/page_world.png +0 -0
  397. data/server/node_modules/express/node_modules/connect/lib/public/style.css +141 -0
  398. data/server/node_modules/express/node_modules/connect/lib/utils.js +444 -0
  399. data/server/node_modules/express/node_modules/connect/package.json +24 -0
  400. data/server/node_modules/express/node_modules/connect/test.js +39 -0
  401. data/server/node_modules/express/node_modules/mime/LICENSE +19 -0
  402. data/server/node_modules/express/node_modules/mime/README.md +50 -0
  403. data/server/node_modules/express/node_modules/mime/index.js +1 -0
  404. data/server/node_modules/express/node_modules/mime/mime.js +92 -0
  405. data/server/node_modules/express/node_modules/mime/mime.types +1479 -0
  406. data/server/node_modules/express/node_modules/mime/node.types +26 -0
  407. data/server/node_modules/express/node_modules/mime/package.json +11 -0
  408. data/server/node_modules/express/node_modules/mime/test.js +80 -0
  409. data/server/node_modules/express/node_modules/qs/History.md +52 -0
  410. data/server/node_modules/express/node_modules/qs/Makefile +7 -0
  411. data/server/node_modules/express/node_modules/qs/Readme.md +49 -0
  412. data/server/node_modules/express/node_modules/qs/benchmark.js +17 -0
  413. data/server/node_modules/express/node_modules/qs/examples.js +48 -0
  414. data/server/node_modules/express/node_modules/qs/index.js +2 -0
  415. data/server/node_modules/express/node_modules/qs/lib/querystring.js +236 -0
  416. data/server/node_modules/express/node_modules/qs/package.json +9 -0
  417. data/server/node_modules/express/node_modules/qs/support/expresso/History.md +128 -0
  418. data/server/node_modules/express/node_modules/qs/support/expresso/Makefile +53 -0
  419. data/server/node_modules/express/node_modules/qs/support/expresso/Readme.md +61 -0
  420. data/server/node_modules/express/node_modules/qs/support/expresso/bin/expresso +856 -0
  421. data/server/node_modules/express/node_modules/qs/support/expresso/docs/api.html +1080 -0
  422. data/server/node_modules/express/node_modules/qs/support/expresso/docs/index.html +377 -0
  423. data/server/node_modules/express/node_modules/qs/support/expresso/docs/index.md +290 -0
  424. data/server/node_modules/express/node_modules/qs/support/expresso/docs/layout/foot.html +3 -0
  425. data/server/node_modules/express/node_modules/qs/support/expresso/docs/layout/head.html +42 -0
  426. data/server/node_modules/express/node_modules/qs/support/expresso/lib/bar.js +4 -0
  427. data/server/node_modules/express/node_modules/qs/support/expresso/lib/foo.js +16 -0
  428. data/server/node_modules/express/node_modules/qs/support/expresso/package.json +12 -0
  429. data/server/node_modules/express/node_modules/qs/support/expresso/test/assert.test.js +91 -0
  430. data/server/node_modules/express/node_modules/qs/support/expresso/test/async.test.js +12 -0
  431. data/server/node_modules/express/node_modules/qs/support/expresso/test/bar.test.js +13 -0
  432. data/server/node_modules/express/node_modules/qs/support/expresso/test/foo.test.js +14 -0
  433. data/server/node_modules/express/node_modules/qs/support/expresso/test/http.test.js +146 -0
  434. data/server/node_modules/express/node_modules/qs/support/expresso/test/serial/async.test.js +39 -0
  435. data/server/node_modules/express/node_modules/qs/support/expresso/test/serial/http.test.js +48 -0
  436. data/server/node_modules/express/node_modules/qs/support/should/History.md +22 -0
  437. data/server/node_modules/express/node_modules/qs/support/should/Makefile +6 -0
  438. data/server/node_modules/express/node_modules/qs/support/should/Readme.md +248 -0
  439. data/server/node_modules/express/node_modules/qs/support/should/examples/runner.js +53 -0
  440. data/server/node_modules/express/node_modules/qs/support/should/index.js +2 -0
  441. data/server/node_modules/express/node_modules/qs/support/should/lib/eql.js +91 -0
  442. data/server/node_modules/express/node_modules/qs/support/should/lib/should.js +548 -0
  443. data/server/node_modules/express/node_modules/qs/support/should/package.json +8 -0
  444. data/server/node_modules/express/node_modules/qs/support/should/test/should.test.js +358 -0
  445. data/server/node_modules/express/node_modules/qs/test/parse.test.js +156 -0
  446. data/server/node_modules/express/node_modules/qs/test/stringify.test.js +95 -0
  447. data/server/node_modules/express/package.json +38 -0
  448. data/server/node_modules/knox/History.md +41 -0
  449. data/server/node_modules/knox/Makefile +21 -0
  450. data/server/node_modules/knox/Readme.md +144 -0
  451. data/server/node_modules/knox/index.html +483 -0
  452. data/server/node_modules/knox/index.js +2 -0
  453. data/server/node_modules/knox/lib/knox/auth.js +190 -0
  454. data/server/node_modules/knox/lib/knox/client.js +355 -0
  455. data/server/node_modules/knox/lib/knox/index.js +36 -0
  456. data/server/node_modules/knox/lib/knox/mime/README.md +19 -0
  457. data/server/node_modules/knox/lib/knox/mime/index.js +308 -0
  458. data/server/node_modules/knox/lib/knox/mime/mime.js +308 -0
  459. data/server/node_modules/knox/lib/knox/mime/package.json +12 -0
  460. data/server/node_modules/knox/lib/knox/mime/test.js +59 -0
  461. data/server/node_modules/knox/lib/knox/utils.js +55 -0
  462. data/server/node_modules/knox/package.json +13 -0
  463. data/server/node_modules/knox/support/expresso/History.md +87 -0
  464. data/server/node_modules/knox/support/expresso/Makefile +53 -0
  465. data/server/node_modules/knox/support/expresso/Readme.md +39 -0
  466. data/server/node_modules/knox/support/expresso/bin/expresso +835 -0
  467. data/server/node_modules/knox/support/expresso/docs/api.html +1048 -0
  468. data/server/node_modules/knox/support/expresso/docs/index.html +373 -0
  469. data/server/node_modules/knox/support/expresso/docs/index.md +290 -0
  470. data/server/node_modules/knox/support/expresso/docs/layout/foot.html +3 -0
  471. data/server/node_modules/knox/support/expresso/docs/layout/head.html +42 -0
  472. data/server/node_modules/knox/support/expresso/lib/bar.js +4 -0
  473. data/server/node_modules/knox/support/expresso/lib/foo.js +16 -0
  474. data/server/node_modules/knox/support/expresso/package.json +9 -0
  475. data/server/node_modules/knox/support/expresso/test/assert.test.js +84 -0
  476. data/server/node_modules/knox/support/expresso/test/async.test.js +6 -0
  477. data/server/node_modules/knox/support/expresso/test/bar.test.js +12 -0
  478. data/server/node_modules/knox/support/expresso/test/foo.test.js +13 -0
  479. data/server/node_modules/knox/support/expresso/test/http.test.js +76 -0
  480. data/server/node_modules/knox/support/expresso/test/serial/async.test.js +38 -0
  481. data/server/node_modules/knox/support/expresso/test/serial/http.test.js +47 -0
  482. data/server/node_modules/knox/test/auth.test.js +59 -0
  483. data/server/node_modules/knox/test/fixtures/user.json +1 -0
  484. data/server/node_modules/knox/test/knox.test.js +188 -0
  485. data/server/node_modules/knox/test/utils.test.js +17 -0
  486. data/server/node_modules/node-uuid/LICENSE.md +3 -0
  487. data/server/node_modules/node-uuid/README.md +100 -0
  488. data/server/node_modules/node-uuid/package.json +12 -0
  489. data/server/node_modules/node-uuid/test/benchmark-native.c +34 -0
  490. data/server/node_modules/node-uuid/test/benchmark.js +27 -0
  491. data/server/node_modules/node-uuid/test/test.html +14 -0
  492. data/server/node_modules/node-uuid/test/test.js +83 -0
  493. data/server/node_modules/node-uuid/uuid.js +80 -0
  494. data/server/node_modules/restler/MIT-LICENSE +20 -0
  495. data/server/node_modules/restler/README.md +147 -0
  496. data/server/node_modules/restler/bin/restler +23 -0
  497. data/server/node_modules/restler/index.js +1 -0
  498. data/server/node_modules/restler/lib/multipartform.js +202 -0
  499. data/server/node_modules/restler/lib/restler.js +300 -0
  500. data/server/node_modules/restler/package.json +10 -0
  501. data/server/node_modules/restler/test/all.js +1 -0
  502. data/server/node_modules/restler/test/restler.js +148 -0
  503. data/server/node_modules/restler/test/test_helper.js +144 -0
  504. data/server/package.json +12 -0
  505. data/server/vendor/gems/bin/restclient +19 -0
  506. data/server/vendor/gems/cache/couchrest-1.1.2.gem +0 -0
  507. data/server/vendor/gems/cache/mime-types-1.16.gem +0 -0
  508. data/server/vendor/gems/cache/multi_json-1.0.3.gem +0 -0
  509. data/server/vendor/gems/cache/rest-client-1.6.7.gem +0 -0
  510. data/server/vendor/gems/gems/couchrest-1.1.2/Gemfile +4 -0
  511. data/server/vendor/gems/gems/couchrest-1.1.2/LICENSE +176 -0
  512. data/server/vendor/gems/gems/couchrest-1.1.2/README.md +65 -0
  513. data/server/vendor/gems/gems/couchrest-1.1.2/Rakefile +38 -0
  514. data/server/vendor/gems/gems/couchrest-1.1.2/THANKS.md +21 -0
  515. data/server/vendor/gems/gems/couchrest-1.1.2/VERSION +1 -0
  516. data/server/vendor/gems/gems/couchrest-1.1.2/couchrest.gemspec +34 -0
  517. data/server/vendor/gems/gems/couchrest-1.1.2/examples/word_count/markov +38 -0
  518. data/server/vendor/gems/gems/couchrest-1.1.2/examples/word_count/views/books/chunked-map.js +3 -0
  519. data/server/vendor/gems/gems/couchrest-1.1.2/examples/word_count/views/books/united-map.js +1 -0
  520. data/server/vendor/gems/gems/couchrest-1.1.2/examples/word_count/views/markov/chain-map.js +6 -0
  521. data/server/vendor/gems/gems/couchrest-1.1.2/examples/word_count/views/markov/chain-reduce.js +7 -0
  522. data/server/vendor/gems/gems/couchrest-1.1.2/examples/word_count/views/word_count/count-map.js +6 -0
  523. data/server/vendor/gems/gems/couchrest-1.1.2/examples/word_count/views/word_count/count-reduce.js +3 -0
  524. data/server/vendor/gems/gems/couchrest-1.1.2/examples/word_count/word_count.rb +46 -0
  525. data/server/vendor/gems/gems/couchrest-1.1.2/examples/word_count/word_count_query.rb +40 -0
  526. data/server/vendor/gems/gems/couchrest-1.1.2/examples/word_count/word_count_views.rb +26 -0
  527. data/server/vendor/gems/gems/couchrest-1.1.2/history.txt +194 -0
  528. data/server/vendor/gems/gems/couchrest-1.1.2/init.rb +1 -0
  529. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest.rb +134 -0
  530. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/attributes.rb +89 -0
  531. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/commands/generate.rb +71 -0
  532. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/commands/push.rb +103 -0
  533. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/database.rb +396 -0
  534. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/design.rb +91 -0
  535. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/document.rb +105 -0
  536. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/helper/attachments.rb +29 -0
  537. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/helper/pager.rb +103 -0
  538. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/helper/streamer.rb +58 -0
  539. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/helper/upgrade.rb +51 -0
  540. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/middlewares/logger.rb +263 -0
  541. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/monkeypatches.rb +25 -0
  542. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/rest_api.rb +159 -0
  543. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/server.rb +90 -0
  544. data/server/vendor/gems/gems/couchrest-1.1.2/lib/couchrest/support/inheritable_attributes.rb +107 -0
  545. data/server/vendor/gems/gems/couchrest-1.1.2/spec/couchrest/couchrest_spec.rb +202 -0
  546. data/server/vendor/gems/gems/couchrest-1.1.2/spec/couchrest/database_spec.rb +921 -0
  547. data/server/vendor/gems/gems/couchrest-1.1.2/spec/couchrest/design_spec.rb +206 -0
  548. data/server/vendor/gems/gems/couchrest-1.1.2/spec/couchrest/document_spec.rb +400 -0
  549. data/server/vendor/gems/gems/couchrest-1.1.2/spec/couchrest/helpers/pager_spec.rb +115 -0
  550. data/server/vendor/gems/gems/couchrest-1.1.2/spec/couchrest/helpers/streamer_spec.rb +59 -0
  551. data/server/vendor/gems/gems/couchrest-1.1.2/spec/couchrest/rest_api_spec.rb +212 -0
  552. data/server/vendor/gems/gems/couchrest-1.1.2/spec/couchrest/server_spec.rb +35 -0
  553. data/server/vendor/gems/gems/couchrest-1.1.2/spec/fixtures/attachments/README +3 -0
  554. data/server/vendor/gems/gems/couchrest-1.1.2/spec/fixtures/attachments/couchdb.png +0 -0
  555. data/server/vendor/gems/gems/couchrest-1.1.2/spec/fixtures/attachments/test.html +11 -0
  556. data/server/vendor/gems/gems/couchrest-1.1.2/spec/fixtures/views/lib.js +3 -0
  557. data/server/vendor/gems/gems/couchrest-1.1.2/spec/fixtures/views/test_view/lib.js +3 -0
  558. data/server/vendor/gems/gems/couchrest-1.1.2/spec/fixtures/views/test_view/only-map.js +4 -0
  559. data/server/vendor/gems/gems/couchrest-1.1.2/spec/fixtures/views/test_view/test-map.js +3 -0
  560. data/server/vendor/gems/gems/couchrest-1.1.2/spec/fixtures/views/test_view/test-reduce.js +3 -0
  561. data/server/vendor/gems/gems/couchrest-1.1.2/spec/spec.opts +5 -0
  562. data/server/vendor/gems/gems/couchrest-1.1.2/spec/spec_helper.rb +46 -0
  563. data/server/vendor/gems/gems/couchrest-1.1.2/utils/remap.rb +27 -0
  564. data/server/vendor/gems/gems/couchrest-1.1.2/utils/subset.rb +30 -0
  565. data/server/vendor/gems/gems/mime-types-1.16/History.txt +107 -0
  566. data/server/vendor/gems/gems/mime-types-1.16/Install.txt +17 -0
  567. data/server/vendor/gems/gems/mime-types-1.16/Licence.txt +15 -0
  568. data/server/vendor/gems/gems/mime-types-1.16/Manifest.txt +12 -0
  569. data/server/vendor/gems/gems/mime-types-1.16/README.txt +28 -0
  570. data/server/vendor/gems/gems/mime-types-1.16/Rakefile +316 -0
  571. data/server/vendor/gems/gems/mime-types-1.16/lib/mime/types.rb +751 -0
  572. data/server/vendor/gems/gems/mime-types-1.16/lib/mime/types.rb.data +1324 -0
  573. data/server/vendor/gems/gems/mime-types-1.16/mime-types.gemspec +43 -0
  574. data/server/vendor/gems/gems/mime-types-1.16/setup.rb +1585 -0
  575. data/server/vendor/gems/gems/mime-types-1.16/test/test_mime_type.rb +356 -0
  576. data/server/vendor/gems/gems/mime-types-1.16/test/test_mime_types.rb +122 -0
  577. data/server/vendor/gems/gems/multi_json-1.0.3/Gemfile +7 -0
  578. data/server/vendor/gems/gems/multi_json-1.0.3/LICENSE.md +20 -0
  579. data/server/vendor/gems/gems/multi_json-1.0.3/README.md +70 -0
  580. data/server/vendor/gems/gems/multi_json-1.0.3/Rakefile +23 -0
  581. data/server/vendor/gems/gems/multi_json-1.0.3/lib/multi_json.rb +74 -0
  582. data/server/vendor/gems/gems/multi_json-1.0.3/lib/multi_json/engines/json_gem.rb +21 -0
  583. data/server/vendor/gems/gems/multi_json-1.0.3/lib/multi_json/engines/json_pure.rb +21 -0
  584. data/server/vendor/gems/gems/multi_json-1.0.3/lib/multi_json/engines/ok_json.rb +48 -0
  585. data/server/vendor/gems/gems/multi_json-1.0.3/lib/multi_json/engines/yajl.rb +18 -0
  586. data/server/vendor/gems/gems/multi_json-1.0.3/lib/multi_json/vendor/ok_json.rb +581 -0
  587. data/server/vendor/gems/gems/multi_json-1.0.3/lib/multi_json/version.rb +3 -0
  588. data/server/vendor/gems/gems/multi_json-1.0.3/multi_json.gemspec +23 -0
  589. data/server/vendor/gems/gems/multi_json-1.0.3/spec/helper.rb +11 -0
  590. data/server/vendor/gems/gems/multi_json-1.0.3/spec/multi_json_spec.rb +134 -0
  591. data/server/vendor/gems/gems/rest-client-1.6.7/README.rdoc +285 -0
  592. data/server/vendor/gems/gems/rest-client-1.6.7/Rakefile +66 -0
  593. data/server/vendor/gems/gems/rest-client-1.6.7/VERSION +1 -0
  594. data/server/vendor/gems/gems/rest-client-1.6.7/bin/restclient +93 -0
  595. data/server/vendor/gems/gems/rest-client-1.6.7/history.md +134 -0
  596. data/server/vendor/gems/gems/rest-client-1.6.7/lib/rest-client.rb +2 -0
  597. data/server/vendor/gems/gems/rest-client-1.6.7/lib/rest_client.rb +2 -0
  598. data/server/vendor/gems/gems/rest-client-1.6.7/lib/restclient.rb +174 -0
  599. data/server/vendor/gems/gems/rest-client-1.6.7/lib/restclient/abstract_response.rb +106 -0
  600. data/server/vendor/gems/gems/rest-client-1.6.7/lib/restclient/exceptions.rb +193 -0
  601. data/server/vendor/gems/gems/rest-client-1.6.7/lib/restclient/net_http_ext.rb +55 -0
  602. data/server/vendor/gems/gems/rest-client-1.6.7/lib/restclient/payload.rb +235 -0
  603. data/server/vendor/gems/gems/rest-client-1.6.7/lib/restclient/raw_response.rb +34 -0
  604. data/server/vendor/gems/gems/rest-client-1.6.7/lib/restclient/request.rb +316 -0
  605. data/server/vendor/gems/gems/rest-client-1.6.7/lib/restclient/resource.rb +169 -0
  606. data/server/vendor/gems/gems/rest-client-1.6.7/lib/restclient/response.rb +24 -0
  607. data/server/vendor/gems/gems/rest-client-1.6.7/spec/abstract_response_spec.rb +85 -0
  608. data/server/vendor/gems/gems/rest-client-1.6.7/spec/base.rb +16 -0
  609. data/server/vendor/gems/gems/rest-client-1.6.7/spec/exceptions_spec.rb +98 -0
  610. data/server/vendor/gems/gems/rest-client-1.6.7/spec/integration/certs/equifax.crt +19 -0
  611. data/server/vendor/gems/gems/rest-client-1.6.7/spec/integration/certs/verisign.crt +14 -0
  612. data/server/vendor/gems/gems/rest-client-1.6.7/spec/integration/request_spec.rb +25 -0
  613. data/server/vendor/gems/gems/rest-client-1.6.7/spec/integration_spec.rb +38 -0
  614. data/server/vendor/gems/gems/rest-client-1.6.7/spec/master_shake.jpg +0 -0
  615. data/server/vendor/gems/gems/rest-client-1.6.7/spec/payload_spec.rb +234 -0
  616. data/server/vendor/gems/gems/rest-client-1.6.7/spec/raw_response_spec.rb +17 -0
  617. data/server/vendor/gems/gems/rest-client-1.6.7/spec/request2_spec.rb +40 -0
  618. data/server/vendor/gems/gems/rest-client-1.6.7/spec/request_spec.rb +529 -0
  619. data/server/vendor/gems/gems/rest-client-1.6.7/spec/resource_spec.rb +134 -0
  620. data/server/vendor/gems/gems/rest-client-1.6.7/spec/response_spec.rb +169 -0
  621. data/server/vendor/gems/gems/rest-client-1.6.7/spec/restclient_spec.rb +73 -0
  622. data/server/vendor/gems/specifications/couchrest-1.1.2.gemspec +43 -0
  623. data/server/vendor/gems/specifications/mime-types-1.16.gemspec +42 -0
  624. data/server/vendor/gems/specifications/multi_json-1.0.3.gemspec +40 -0
  625. data/server/vendor/gems/specifications/rest-client-1.6.7.gemspec +37 -0
  626. data/server/web.js +93 -0
  627. metadata +633 -7
@@ -0,0 +1,121 @@
1
+ # Connect
2
+
3
+ Connect is a high performance middleware framework built by the combined forces of Tim Caswell ([creationix][]) and TJ Holowaychuk ([visionmedia][]) and the other skilled developers of [Sencha][]. Connect takes the familiar concepts of Ruby's [Rack](http://rack.rubyforge.org/) and applies it to the asynchronous world of [node](http://nodejs.org).
4
+
5
+ ExtJS is releasing Connect under the very liberal MIT license in hopes that we can provide some level of leadership and stability for application frameworks to build on.
6
+
7
+ ## Features
8
+
9
+ * High performance api, with nearly no overhead.
10
+ * Several bundled middleware implementations such as _log_, _static_, and _json-rpc_.
11
+ * The _connect_ executable for daemonizing node, and Connect servers.
12
+
13
+ ## Hello World
14
+
15
+ The simplest connect app looks just like `http.Server` instances from node. In fact `Connect.Server` inherits from `http.Server`.
16
+
17
+ var Connect = require('connect');
18
+ module.exports = Connect.createServer(function(req, res) {
19
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
20
+ res.end('Hello World');
21
+ });
22
+
23
+ Then to run it, save that snippet as `app.js` and either use the `connect` executable in the bin dir or create a simple runner file `server.js`.
24
+
25
+ #!/usr/bin/env node
26
+ require('./app').listen(8080);
27
+
28
+ Then if you want to add in a pre-built feature like logging just add it to the createServer call.
29
+
30
+ module.exports = Connect.createServer(
31
+ Connect.logger(),
32
+ function(req, res) {
33
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
34
+ res.end('Hello World');
35
+ }
36
+ );
37
+
38
+ It's that simple.
39
+
40
+ ## Installation
41
+
42
+ Via curl / sh:
43
+
44
+ $ curl -# http://github.com/senchalabs/connect/raw/master/install.sh | sh
45
+
46
+ Via git (or downloaded tarball):
47
+
48
+ $ git clone git://github.com/senchalabs/connect.git && cd Connect && make install
49
+
50
+ Via [npm](http://github.com/isaacs/npm):
51
+
52
+ $ npm install connect
53
+
54
+ ## Documentation
55
+
56
+ View the man page:
57
+
58
+ $ man connect
59
+
60
+ View the HTML document:
61
+
62
+ $ open docs/api.html
63
+
64
+ View the online HTML documentation:
65
+
66
+ $ open http://extjs.github.com/Connect
67
+
68
+ View one of several examples located within _./examples_.
69
+
70
+ ## Running Benchmarks
71
+
72
+ To run the benchmarks you must have ApacheBench, and gnuplot installed, then:
73
+
74
+ $ make benchmark && make graphs && open results/graphs/*.png
75
+
76
+ ## Testing
77
+
78
+ First update the git submodules, which includes
79
+ the [Expresso](http://github.com/visionmedia/expresso) TDD
80
+ framework:
81
+
82
+ $ git submodule update --init
83
+
84
+ Then run the test suites located in _./test_ with the following command:
85
+
86
+ $ make test
87
+
88
+ Run a single test, or use a custom glob pattern:
89
+
90
+ $ make test TESTS=test/connect.test.js
91
+
92
+ [creationix]: http://github.com/creationix
93
+ [visionmedia]: http://github.com/visionmedia
94
+ [Sencha]: http://www.sencha.com/
95
+ [Rack]: http://rack.rubyforge.org/
96
+ [Node.JS]: http://nodejs.org/
97
+
98
+ ## License
99
+
100
+ (The MIT License)
101
+
102
+ Copyright (c) 2010 Sencha Inc.
103
+
104
+ Permission is hereby granted, free of charge, to any person obtaining
105
+ a copy of this software and associated documentation files (the
106
+ 'Software'), to deal in the Software without restriction, including
107
+ without limitation the rights to use, copy, modify, merge, publish,
108
+ distribute, sublicense, and/or sell copies of the Software, and to
109
+ permit persons to whom the Software is furnished to do so, subject to
110
+ the following conditions:
111
+
112
+ The above copyright notice and this permission notice shall be
113
+ included in all copies or substantial portions of the Software.
114
+
115
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
116
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
117
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
118
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
119
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
120
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
121
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env bash
2
+
3
+ COL=${COL-9}
4
+ ABFLAGS=$(cat results/flags)
5
+
6
+ # Log <msg ...>
7
+ #
8
+ # <msg ...>
9
+ #
10
+
11
+ log(){
12
+ echo "... $@"
13
+ }
14
+
15
+ #
16
+ # Output gnuplot script for line graph.
17
+ #
18
+ # <title> <node> <connect>
19
+ #
20
+
21
+ function line() {
22
+ cat <<-EOF
23
+ set terminal png
24
+ set output "results/graphs/$1.png"
25
+ set title "$1 $ABFLAGS"
26
+ set size 1,0.7
27
+ set grid y
28
+ set key left top
29
+ set xlabel "request"
30
+ set ylabel "response time (ms)"
31
+ plot "$2" using $COL smooth sbezier with lines title "node", \\
32
+ "$3" using $COL smooth sbezier with lines title "connect", \\
33
+ "$4" using $COL smooth sbezier with lines title "rack thin", \\
34
+ "$5" using $COL smooth sbezier with lines title "sinatra thin"
35
+ EOF
36
+ }
37
+
38
+ #
39
+ # Output gnuplot script for bar graph.
40
+ #
41
+ # <title> <node> <connect>
42
+ #
43
+
44
+ function bar() {
45
+ cat <<-EOF
46
+ set terminal png
47
+ set output "results/graphs/$1.rps.png"
48
+ set title "$1 $ABFLAGS"
49
+ set size 0.7,0.5
50
+ set grid y
51
+ set key left top
52
+ set ylabel "requests per second"
53
+ plot "$1.rps.dat" using 2: xtic(1) with histogram title ""
54
+ EOF
55
+ }
56
+
57
+ #
58
+ # Graph the output of the given <dir>.
59
+ #
60
+ # <dir>
61
+ #
62
+
63
+ function graph(){
64
+ log graphing $1
65
+ local dir=results/benchmarks/$1
66
+ line $1 \
67
+ $dir/node.js.dat \
68
+ $dir/connect.js.dat \
69
+ $dir/rack.thin.ru.dat \
70
+ $dir/sinatra.thin.ru.dat \
71
+ > results/$1.p
72
+ gnuplot results/$1.p
73
+ }
74
+
75
+ # Make ./results/graphs
76
+ mkdir -p results/graphs
77
+
78
+ graph hello-world
79
+ graph static
@@ -0,0 +1,19 @@
1
+
2
+ /**
3
+ * Module dependencies.
4
+ */
5
+
6
+ var connect = require('../../lib/connect'),
7
+ Buffer = require('buffer').Buffer,
8
+ body = new Buffer('Hello World', 'ascii');
9
+
10
+
11
+ connect.createServer(
12
+ function(req, res, next){
13
+ res.writeHead(200, {
14
+ 'Content-Type': 'text/plain',
15
+ 'Content-Length': body.length
16
+ });
17
+ res.end(body);
18
+ }
19
+ ).listen(3000);
@@ -0,0 +1,16 @@
1
+
2
+ /**
3
+ * Module dependencies.
4
+ */
5
+
6
+ var http = require('http'),
7
+ Buffer = require('buffer').Buffer,
8
+ body = new Buffer('Hello World', 'ascii');
9
+
10
+ http.createServer(function(req, res){
11
+ res.writeHead(200, {
12
+ 'Content-Type': 'text/plain',
13
+ 'Content-Length': body.length
14
+ });
15
+ res.end(body);
16
+ }).listen(3000);
@@ -0,0 +1,9 @@
1
+
2
+ body = 'Hello World'
3
+
4
+ run lambda {
5
+ [200, {
6
+ 'Content-Type' => 'text/plain',
7
+ 'Content-Length' => body.length.to_s
8
+ }, body]
9
+ }
@@ -0,0 +1,10 @@
1
+
2
+ require 'rubygems'
3
+ require 'sinatra'
4
+
5
+ get '/' do
6
+ 'Hello World'
7
+ end
8
+
9
+ disable :logging
10
+ run Sinatra::Application
@@ -0,0 +1,19 @@
1
+ /*
2
+ * jQuery JavaScript Library v1.3.2
3
+ * http://jquery.com/
4
+ *
5
+ * Copyright (c) 2009 John Resig
6
+ * Dual licensed under the MIT and GPL licenses.
7
+ * http://docs.jquery.com/License
8
+ *
9
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
10
+ * Revision: 6246
11
+ */
12
+ (function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
13
+ /*
14
+ * Sizzle CSS Selector Engine - v0.9.3
15
+ * Copyright 2009, The Dojo Foundation
16
+ * Released under the MIT, BSD, and GPL Licenses.
17
+ * More information: http://sizzlejs.com/
18
+ */
19
+ (function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env bash
2
+
3
+ ABFLAGS=${ABFLAGS-"-n 2000 -c 50 -k"}
4
+ ADDR=${ADDR-http://0.0.0.0:3000/}
5
+ AB=${AB-ab}
6
+
7
+ #
8
+ # Log <msg ...>
9
+ #
10
+ # <msg ...>
11
+ #
12
+
13
+ log(){
14
+ echo "... $@"
15
+ }
16
+
17
+ #
18
+ # Benchmark the given <dir> and [path].
19
+ #
20
+ # <dir> [path]
21
+ #
22
+
23
+ bm(){
24
+ local dir=$1;
25
+ local path=${2-/};
26
+ for file in benchmarks/$dir/*; do
27
+ log running $file
28
+ case $file in
29
+ *.js)
30
+ node $file &
31
+ sleep 2
32
+ ;;
33
+ *.thin.ru)
34
+ thin -R $file -p 3000 start &
35
+ sleep 2
36
+ ;;
37
+ *.mongrel.ru)
38
+ rackup $file -p 3000 -s mongrel &
39
+ sleep 2
40
+ ;;
41
+ esac
42
+ local pid=$!
43
+ local dirname=results/$(dirname $file)
44
+ mkdir -p $dirname
45
+ $AB $ABFLAGS -g results/$file.dat $ADDR/$path > results/$file.out
46
+ log $(cat results/$file.out | grep Requests)
47
+ kill -9 $pid
48
+ done
49
+ }
50
+
51
+ # Make ./results
52
+ mkdir -p results
53
+
54
+ # Store flags
55
+ echo $ABFLAGS > results/flags
56
+
57
+ # Run benchmarks
58
+ log $AB $ABFLAGS $ADDR
59
+ bm hello-world
60
+ bm static /jquery.js
@@ -0,0 +1,10 @@
1
+
2
+ /**
3
+ * Module dependencies.
4
+ */
5
+
6
+ var connect = require('../../lib/connect');
7
+
8
+ connect.createServer(
9
+ connect.staticProvider(__dirname + '/../public')
10
+ ).listen(3000);
@@ -0,0 +1,17 @@
1
+
2
+ /**
3
+ * Module dependencies.
4
+ */
5
+
6
+ var http = require('http'),
7
+ fs = require('fs'),
8
+ body = fs.readFileSync(__dirname + '/../public/jquery.js'),
9
+ len = body.length;
10
+
11
+ http.createServer(function(req, res){
12
+ res.writeHead(200, {
13
+ 'Content-Type': 'application/javascript',
14
+ 'Content-Length': len
15
+ });
16
+ res.end(body);
17
+ }).listen(3000);
@@ -0,0 +1,10 @@
1
+
2
+ require 'rubygems'
3
+ require 'sinatra'
4
+
5
+ get '/jquery.js' do
6
+ send_file File.dirname(__FILE__) + '/../public/jquery.js'
7
+ end
8
+
9
+ disable :logging
10
+ run Sinatra::Application
@@ -0,0 +1,1973 @@
1
+ <html>
2
+ <head>
3
+ <title>Connect</title>
4
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
5
+ <style>body {
6
+ margin: 0;
7
+ padding: 0;
8
+ font: 14px/1.5 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
9
+ color: #252519;
10
+ }
11
+ a {
12
+ color: #252519;
13
+ }
14
+ a:hover {
15
+ text-decoration: underline;
16
+ color: #19469D;
17
+ }
18
+ p {
19
+ margin: 12px 0;
20
+ }
21
+ h1, h2, h3 {
22
+ margin: 0;
23
+ padding: 0;
24
+ }
25
+ table#source {
26
+ width: 100%;
27
+ border-collapse: collapse;
28
+ }
29
+ table#source td:first-child {
30
+ padding: 30px 40px 30px 40px;
31
+ vertical-align: top;
32
+ }
33
+ table#source td:first-child,
34
+ table#source td:first-child pre {
35
+ width: 450px;
36
+ }
37
+ table#source td:last-child {
38
+ padding: 30px 0 30px 40px;
39
+ border-left: 1px solid #E5E5EE;
40
+ background: #F5F5FF;
41
+ }
42
+ table#source tr {
43
+ border-bottom: 1px solid #E5E5EE;
44
+ }
45
+ table#source tr.filename {
46
+ padding-top: 40px;
47
+ border-top: 1px solid #E5E5EE;
48
+ }
49
+ table#source tr.filename td:first-child {
50
+ text-transform: capitalize;
51
+ }
52
+ table#source tr.filename td:last-child {
53
+ font-size: 12px;
54
+ }
55
+ table#source tr.filename h2 {
56
+ margin: 0;
57
+ padding: 0;
58
+ cursor: pointer;
59
+ }
60
+ table#source tr.code h1,
61
+ table#source tr.code h2,
62
+ table#source tr.code h3 {
63
+ margin-top: 30px;
64
+ font-family: "Lucida Grande", "Helvetica Nueue", Arial, sans-serif;
65
+ font-size: 18px;
66
+ }
67
+ table#source tr.code h2 {
68
+ font-size: 16px;
69
+ }
70
+ table#source tr.code h3 {
71
+ font-size: 14px;
72
+ }
73
+ table#source tr.code ul {
74
+ margin: 15px 0 15px 35px;
75
+ padding: 0;
76
+ }
77
+ table#source tr.code ul li {
78
+ margin: 0;
79
+ padding: 1px 0;
80
+ }
81
+ table#source tr.code ul li p {
82
+ margin: 0;
83
+ padding: 0;
84
+ }
85
+ table#source tr.code td:first-child pre {
86
+ padding: 20px;
87
+ }
88
+ #ribbon {
89
+ position: fixed;
90
+ top: 0;
91
+ right: 0;
92
+ }
93
+ code .string { color: #219161; }
94
+ code .regexp { color: #219161; }
95
+ code .keyword { color: #954121; }
96
+ code .number { color: #19469D; }
97
+ code .comment { color: #bbb; }
98
+ code .this { color: #19469D; }</style>
99
+ <script>
100
+ $(function(){
101
+ $('tr.code').hide();
102
+ $('tr.filename').toggle(function(){
103
+ $(this).nextUntil('.filename').fadeIn();
104
+ }, function(){
105
+ $(this).nextUntil('.filename').fadeOut();
106
+ });
107
+ });
108
+ </script>
109
+ </head>
110
+ <body>
111
+ <table id="source"><tbody><tr><td><h1>Connect</h1><p>High performance middleware for <a href="http://nodejs.org">node</a>.</p></td><td></td></tr><tr class="filename"><td><h2 id="lib/connect/middleware/bodyDecoder.js"><a href="#">bodyDecoder</a></h2></td><td>lib/connect/middleware/bodyDecoder.js</td></tr><tr class="code">
112
+ <td class="docs">
113
+ <p>Module dependencies.
114
+ </p>
115
+ </td>
116
+ <td class="code">
117
+ <pre><code><span class="keyword">var</span> <span class="variable">queryString</span> = <span class="variable">require</span>(<span class="string">'querystring'</span>);</code></pre>
118
+ </td>
119
+ </tr>
120
+ <tr class="code">
121
+ <td class="docs">
122
+ <p>Supported decoders.</p>
123
+
124
+ <ul><li>application/x-www-form-urlencoded</li><li>application/json</li></ul>
125
+ </td>
126
+ <td class="code">
127
+ <pre><code><span class="variable">exports</span>.<span class="variable">decode</span> = {
128
+ <span class="string">'application/x-www-form-urlencoded'</span>: <span class="variable">queryString</span>.<span class="variable">parse</span>,
129
+ <span class="string">'application/json'</span>: <span class="class">JSON</span>.<span class="variable">parse</span>
130
+ };</code></pre>
131
+ </td>
132
+ </tr>
133
+ <tr class="code">
134
+ <td class="docs">
135
+ <p>Decode request bodies.</p>
136
+
137
+ <h2></h2>
138
+
139
+ <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
140
+ </td>
141
+ <td class="code">
142
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">bodyDecoder</span>(){
143
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">bodyDecoder</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
144
+ <span class="keyword">var</span> <span class="variable">decoder</span> = <span class="variable">exports</span>.<span class="variable">decode</span>[<span class="variable">mime</span>(<span class="variable">req</span>)];
145
+ <span class="keyword">if</span> (<span class="variable">decoder</span>) {
146
+ <span class="keyword">var</span> <span class="variable">data</span> = <span class="string">''</span>;
147
+ <span class="variable">req</span>.<span class="variable">setEncoding</span>(<span class="string">'utf8'</span>);
148
+ <span class="variable">req</span>.<span class="variable">addListener</span>(<span class="string">'data'</span>, <span class="keyword">function</span>(<span class="variable">chunk</span>) { <span class="variable">data</span> += <span class="variable">chunk</span>; });
149
+ <span class="variable">req</span>.<span class="variable">addListener</span>(<span class="string">'end'</span>, <span class="keyword">function</span>() {
150
+ <span class="variable">req</span>.<span class="variable">rawBody</span> = <span class="variable">data</span>;
151
+ <span class="keyword">try</span> {
152
+ <span class="variable">req</span>.<span class="variable">body</span> = <span class="variable">data</span>
153
+ ? <span class="variable">decoder</span>(<span class="variable">data</span>)
154
+ : {};
155
+ } <span class="keyword">catch</span> (<span class="variable">err</span>) {
156
+ <span class="keyword">return</span> <span class="variable">next</span>(<span class="variable">err</span>);
157
+ }
158
+ <span class="variable">next</span>();
159
+ });
160
+ } <span class="keyword">else</span> {
161
+ <span class="variable">next</span>();
162
+ }
163
+ }
164
+ };</code></pre>
165
+ </td>
166
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/cache.js"><a href="#">cache</a></h2></td><td>lib/connect/middleware/cache.js</td></tr><tr class="code">
167
+ <td class="docs">
168
+ <p>Module dependencies.
169
+ </p>
170
+ </td>
171
+ <td class="code">
172
+ <pre><code><span class="keyword">var</span> <span class="class">Buffer</span> = <span class="variable">require</span>(<span class="string">'buffer'</span>).<span class="class">Buffer</span>;</code></pre>
173
+ </td>
174
+ </tr>
175
+ <tr class="code">
176
+ <td class="docs">
177
+ <p>Cache in memory for the given <code>cacheDuration</code>.</p>
178
+
179
+ <h2></h2>
180
+
181
+ <ul><li><p><strong>param</strong>: <em>Number</em> cacheDuration</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
182
+ </td>
183
+ <td class="code">
184
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">cache</span>(<span class="variable">cacheDuration</span>){
185
+ <span class="keyword">var</span> <span class="variable">cache</span> = {},
186
+ <span class="variable">queue</span> = {};
187
+
188
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">cache</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
189
+
190
+ <span class="comment">// Skip all requests that are not GET method</span>
191
+ <span class="keyword">if</span> (<span class="variable">req</span>.<span class="variable">method</span> !== &<span class="variable">quot</span>;<span class="class">GET</span>&<span class="variable">quot</span>;) {
192
+ <span class="variable">next</span>();
193
+ <span class="keyword">return</span>;
194
+ }
195
+
196
+ <span class="keyword">var</span> <span class="variable">key</span> = <span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="variable">accept</span>-<span class="variable">encoding</span>&<span class="variable">quot</span>;] + <span class="variable">req</span>.<span class="variable">url</span>,
197
+ <span class="variable">writeHead</span> = <span class="variable">res</span>.<span class="variable">writeHead</span>,
198
+ <span class="variable">write</span> = <span class="variable">res</span>.<span class="variable">write</span>,
199
+ <span class="variable">end</span> = <span class="variable">res</span>.<span class="variable">end</span>,
200
+ <span class="variable">code</span>,
201
+ <span class="variable">headers</span>,
202
+ <span class="variable">chunks</span> = [],
203
+ <span class="variable">totalSize</span> = <span class="number integer">0</span>;
204
+
205
+ <span class="keyword">function</span> <span class="variable">serve</span>() {
206
+ <span class="keyword">var</span> <span class="variable">resp</span> = <span class="variable">cache</span>[<span class="variable">key</span>];
207
+ <span class="keyword">var</span> <span class="variable">headers</span> = <span class="variable">resp</span>.<span class="variable">headers</span>;
208
+ <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Date</span>&<span class="variable">quot</span>;] = (<span class="keyword">new</span> <span class="class">Date</span>).<span class="variable">toUTCString</span>();
209
+ <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Length</span>&<span class="variable">quot</span>;] = <span class="variable">resp</span>.<span class="variable">body</span>.<span class="variable">length</span>;
210
+
211
+ <span class="keyword">if</span> (<span class="variable">localQueue</span>) {
212
+ <span class="comment">// Send everyone in the wait queue the response.</span>
213
+ <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">l</span> = <span class="variable">localQueue</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">l</span>; <span class="variable">i</span>++) {
214
+ <span class="keyword">var</span> <span class="variable">localRes</span> = <span class="variable">localQueue</span>[<span class="variable">i</span>];
215
+ <span class="variable">localRes</span>.<span class="variable">writeHead</span>(<span class="variable">resp</span>.<span class="variable">code</span>, <span class="variable">headers</span>);
216
+ <span class="variable">localRes</span>.<span class="variable">end</span>(<span class="variable">resp</span>.<span class="variable">body</span>);
217
+ }
218
+ <span class="comment">// Kill the wait queue</span>
219
+ <span class="keyword">delete</span> <span class="variable">queue</span>[<span class="variable">key</span>];
220
+ } <span class="keyword">else</span> {
221
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">resp</span>.<span class="variable">code</span>, <span class="variable">headers</span>);
222
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">resp</span>.<span class="variable">body</span>);
223
+ }
224
+
225
+ }
226
+
227
+ <span class="comment">// If there is a cache-hit, serve it right away!</span>
228
+ <span class="keyword">if</span> (<span class="variable">cache</span>[<span class="variable">key</span>]) {
229
+ <span class="variable">serve</span>();
230
+ <span class="keyword">return</span>;
231
+ }
232
+
233
+ <span class="keyword">var</span> <span class="variable">localQueue</span> = <span class="variable">queue</span>[<span class="variable">key</span>];
234
+ <span class="keyword">if</span> (<span class="variable">localQueue</span>) {
235
+ <span class="variable">localQueue</span>[<span class="variable">localQueue</span>.<span class="variable">length</span>] = <span class="variable">res</span>;
236
+ <span class="keyword">return</span>;
237
+ }
238
+ <span class="variable">localQueue</span> = <span class="variable">queue</span>[<span class="variable">key</span>] = [<span class="variable">res</span>];
239
+
240
+ <span class="comment">// Defer the call to writeHead</span>
241
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="keyword">function</span> (<span class="variable">setCode</span>, <span class="variable">setHeaders</span>) {
242
+ <span class="variable">code</span> = <span class="variable">setCode</span>;
243
+ <span class="variable">headers</span> = <span class="variable">setHeaders</span>;
244
+ };
245
+
246
+ <span class="comment">// Buffer the response body as an array of Buffer objects</span>
247
+ <span class="variable">res</span>.<span class="variable">write</span> = <span class="keyword">function</span> (<span class="variable">chunk</span>, <span class="variable">encoding</span>) {
248
+ <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">chunk</span> === <span class="string">'string'</span>) {
249
+ <span class="keyword">var</span> <span class="variable">length</span>;
250
+ <span class="keyword">if</span> (!<span class="variable">encoding</span> || <span class="variable">encoding</span> === <span class="string">'utf8'</span>) {
251
+ <span class="variable">length</span> = <span class="class">Buffer</span>.<span class="variable">byteLength</span>(<span class="variable">chunk</span>);
252
+ }
253
+ <span class="keyword">var</span> <span class="variable">buffer</span> = <span class="keyword">new</span> <span class="class">Buffer</span>(<span class="variable">length</span>);
254
+ <span class="variable">buffer</span>.<span class="variable">write</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>);
255
+ <span class="variable">chunks</span>.<span class="variable">push</span>(<span class="variable">buffer</span>);
256
+ } <span class="keyword">else</span> {
257
+ <span class="variable">chunks</span>.<span class="variable">push</span>(<span class="variable">chunk</span>);
258
+ }
259
+ <span class="variable">totalSize</span> += <span class="variable">chunk</span>.<span class="variable">length</span>;
260
+ };
261
+
262
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="keyword">function</span> (<span class="variable">chunk</span>, <span class="variable">encoding</span>) {
263
+ <span class="keyword">if</span> (<span class="variable">chunk</span>) {
264
+ <span class="variable">res</span>.<span class="variable">write</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>);
265
+ }
266
+
267
+ <span class="comment">// Combine the buffer array into a single buffer</span>
268
+ <span class="keyword">var</span> <span class="variable">body</span> = <span class="keyword">new</span> <span class="class">Buffer</span>(<span class="variable">totalSize</span>);
269
+ <span class="keyword">var</span> <span class="variable">offset</span> = <span class="number integer">0</span>;
270
+ <span class="variable">chunks</span>.<span class="variable">forEach</span>(<span class="keyword">function</span> (<span class="variable">chunk</span>) {
271
+ <span class="variable">chunk</span>.<span class="variable">copy</span>(<span class="variable">body</span>, <span class="variable">offset</span>);
272
+ <span class="variable">offset</span> += <span class="variable">chunk</span>.<span class="variable">length</span>;
273
+ });
274
+
275
+ <span class="comment">// Store the result in the cache</span>
276
+ <span class="variable">cache</span>[<span class="variable">key</span>] = {
277
+ <span class="variable">body</span>: <span class="variable">body</span>,
278
+ <span class="variable">code</span>: <span class="variable">code</span>,
279
+ <span class="variable">headers</span>: <span class="variable">headers</span>
280
+ };
281
+
282
+ <span class="comment">// Put the original methods back in place</span>
283
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>;
284
+ <span class="variable">res</span>.<span class="variable">write</span> = <span class="variable">write</span>;
285
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="variable">end</span>;
286
+
287
+ <span class="comment">// Serve the response from the cache</span>
288
+ <span class="variable">serve</span>();
289
+
290
+ <span class="keyword">if</span> (<span class="variable">cacheDuration</span>) {
291
+ <span class="comment">// Expire the ram cache after 100ms or the specified length</span>
292
+ <span class="variable">setTimeout</span>(<span class="keyword">function</span>(){
293
+ <span class="keyword">delete</span> <span class="variable">cache</span>[<span class="variable">key</span>];
294
+ }, <span class="variable">cacheDuration</span>);
295
+ } <span class="keyword">else</span> {
296
+ <span class="comment">// When the timeout is zero, just kill it right away</span>
297
+ <span class="keyword">delete</span> <span class="variable">cache</span>[<span class="variable">key</span>];
298
+ }
299
+
300
+ };
301
+
302
+ <span class="variable">next</span>();
303
+ };
304
+ };</code></pre>
305
+ </td>
306
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/cacheManifest.js"><a href="#">cacheManifest</a></h2></td><td>lib/connect/middleware/cacheManifest.js</td></tr><tr class="code">
307
+ <td class="docs">
308
+ <p>Module dependencies.
309
+ </p>
310
+ </td>
311
+ <td class="code">
312
+ <pre><code><span class="keyword">var</span> <span class="variable">fs</span> = <span class="variable">require</span>(<span class="string">'fs'</span>),
313
+ <span class="class">Utils</span> = <span class="variable">require</span>(<span class="string">'../utils'</span>),
314
+ <span class="class">Url</span> = <span class="variable">require</span>(<span class="string">'url'</span>),
315
+ <span class="class">Path</span> = <span class="variable">require</span>(<span class="string">'path'</span>);</code></pre>
316
+ </td>
317
+ </tr>
318
+ <tr class="code">
319
+ <td class="docs">
320
+ <p>Generate cache manifest for the given <code>root</code>, <code>networks</code>,
321
+ and <code>fallbacks</code>.</p>
322
+
323
+ <h2></h2>
324
+
325
+ <ul><li><p><strong>param</strong>: <em>String</em> root</p></li><li><p><strong>param</strong>: <em>Array</em> networks</p></li><li><p><strong>param</strong>: <em>Array</em> fallbacks</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
326
+ </td>
327
+ <td class="code">
328
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">cacheManifest</span>(<span class="variable">root</span>, <span class="variable">networks</span>, <span class="variable">fallbacks</span>) {
329
+ <span class="variable">root</span> = <span class="variable">root</span> || <span class="variable">process</span>.<span class="variable">cwd</span>();
330
+ <span class="keyword">var</span> <span class="variable">suffix</span> = &<span class="variable">quot</span>;&<span class="variable">quot</span>;;
331
+
332
+ <span class="comment">// List of networks as an array of strings</span>
333
+ <span class="keyword">if</span> (<span class="variable">networks</span>) {
334
+ <span class="variable">suffix</span> += &<span class="variable">quot</span>;\<span class="variable">n</span>\<span class="variable">nNETWORK</span>:\<span class="variable">n</span>&<span class="variable">quot</span>; + <span class="variable">networks</span>.<span class="variable">join</span>(&<span class="variable">quot</span>;\<span class="variable">n</span>&<span class="variable">quot</span>;);
335
+ }
336
+
337
+ <span class="comment">// List of fallbacks as key/value pairs</span>
338
+ <span class="keyword">if</span> (<span class="variable">fallbacks</span>) {
339
+ <span class="variable">suffix</span> += &<span class="variable">quot</span>;\<span class="variable">n</span>\<span class="variable">nFALLBACK</span>:\<span class="variable">n</span>&<span class="variable">quot</span>; +
340
+ <span class="variable">fallbacks</span>.<span class="variable">map</span>(<span class="keyword">function</span> (<span class="variable">second</span>, <span class="variable">first</span>) {
341
+ <span class="keyword">return</span> <span class="variable">first</span> + &<span class="variable">quot</span>; &<span class="variable">quot</span>; + <span class="variable">second</span>;
342
+ }).<span class="variable">join</span>(&<span class="variable">quot</span>;\<span class="variable">n</span>&<span class="variable">quot</span>;);
343
+ }
344
+
345
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">cacheManifest</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
346
+ <span class="keyword">if</span> (<span class="class">Url</span>.<span class="variable">parse</span>(<span class="variable">req</span>.<span class="variable">url</span>).<span class="variable">pathname</span> === &<span class="variable">quot</span>;/<span class="variable">cache</span>.<span class="variable">manifest</span>&<span class="variable">quot</span>;) {
347
+ <span class="class">Utils</span>.<span class="variable">find</span>(<span class="variable">root</span>, (<span class="regexp">/./</span>), <span class="keyword">function</span> (<span class="variable">err</span>, <span class="variable">files</span>) {
348
+ <span class="keyword">var</span> <span class="variable">latestMtime</span> = <span class="number integer">0</span>;
349
+ <span class="variable">files</span> = <span class="variable">files</span>.<span class="variable">map</span>(<span class="keyword">function</span> (<span class="variable">entry</span>) {
350
+ <span class="keyword">if</span> (<span class="variable">entry</span>.<span class="variable">mtime</span> &<span class="variable">gt</span>; <span class="variable">latestMtime</span>) {
351
+ <span class="variable">latestMtime</span> = <span class="variable">entry</span>.<span class="variable">mtime</span>;
352
+ }
353
+ <span class="keyword">return</span> <span class="variable">entry</span>.<span class="variable">path</span>.<span class="variable">substr</span>(<span class="number integer">1</span>);
354
+ });
355
+ <span class="keyword">var</span> <span class="variable">manifest</span> = &<span class="variable">quot</span>;<span class="class">CACHE</span> <span class="class">MANIFEST</span>\<span class="variable">n</span>&<span class="variable">quot</span>;
356
+ + &<span class="variable">quot</span>;# &<span class="variable">quot</span>; + <span class="variable">latestMtime</span>.<span class="variable">toUTCString</span>() + &<span class="variable">quot</span>;\<span class="variable">n</span>&<span class="variable">quot</span>;
357
+ + <span class="variable">files</span>.<span class="variable">join</span>(&<span class="variable">quot</span>;\<span class="variable">n</span>&<span class="variable">quot</span>;)
358
+ + <span class="variable">suffix</span>;
359
+
360
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">200</span>, {
361
+ &<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Type</span>&<span class="variable">quot</span>;: &<span class="variable">quot</span>;<span class="variable">text</span>/<span class="variable">cache</span>-<span class="variable">manifest</span>&<span class="variable">quot</span>;,
362
+ &<span class="variable">quot</span>;<span class="class">Last</span>-<span class="class">Modified</span>&<span class="variable">quot</span>;: <span class="variable">latestMtime</span>.<span class="variable">toUTCString</span>(),
363
+ &<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Length</span>&<span class="variable">quot</span>;: <span class="variable">manifest</span>.<span class="variable">length</span>
364
+ });
365
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">manifest</span>);
366
+ });
367
+ <span class="keyword">return</span>;
368
+ }
369
+ <span class="variable">next</span>();
370
+ };
371
+ };</code></pre>
372
+ </td>
373
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/compiler.js"><a href="#">compiler</a></h2></td><td>lib/connect/middleware/compiler.js</td></tr><tr class="code">
374
+ <td class="docs">
375
+ <p>Module dependencies.
376
+ </p>
377
+ </td>
378
+ <td class="code">
379
+ <pre><code><span class="keyword">var</span> <span class="variable">fs</span> = <span class="variable">require</span>(<span class="string">'fs'</span>),
380
+ <span class="variable">path</span> = <span class="variable">require</span>(<span class="string">'path'</span>);</code></pre>
381
+ </td>
382
+ </tr>
383
+ <tr class="code">
384
+ <td class="docs">
385
+ <p>Bundled compilers:</p>
386
+
387
+ <ul><li><a href="http://github.com/visionmedia/sass.js">sass</a> to <em>css</em></li><li><a href="http://github.com/cloudhead/less.js">less</a> to <em>css</em></li></ul>
388
+ </td>
389
+ <td class="code">
390
+ <pre><code><span class="keyword">var</span> <span class="variable">compilers</span> = <span class="variable">exports</span>.<span class="variable">compilers</span> = {
391
+ <span class="variable">sass</span>: {
392
+ <span class="variable">match</span>: <span class="regexp">/\.css$/</span>,
393
+ <span class="variable">ext</span>: <span class="string">'.sass'</span>,
394
+ <span class="variable">compile</span>: <span class="keyword">function</span>(<span class="variable">str</span>, <span class="variable">fn</span>){
395
+ <span class="variable">require</span>.<span class="variable">async</span>(<span class="string">'sass'</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">sass</span>){
396
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
397
+ <span class="variable">fn</span>(<span class="variable">err</span>);
398
+ } <span class="keyword">else</span> {
399
+ <span class="keyword">try</span> {
400
+ <span class="variable">fn</span>(<span class="keyword">null</span>, <span class="variable">sass</span>.<span class="variable">render</span>(<span class="variable">str</span>));
401
+ } <span class="keyword">catch</span> (<span class="variable">err</span>) {
402
+ <span class="variable">fn</span>(<span class="variable">err</span>);
403
+ }
404
+ }
405
+ });
406
+ }
407
+ },
408
+ <span class="variable">less</span>: {
409
+ <span class="variable">match</span>: <span class="regexp">/\.css$/</span>,
410
+ <span class="variable">ext</span>: <span class="string">'.less'</span>,
411
+ <span class="variable">compile</span>: <span class="keyword">function</span>(<span class="variable">str</span>, <span class="variable">fn</span>){
412
+ <span class="variable">require</span>.<span class="variable">async</span>(<span class="string">'less'</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">less</span>){
413
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
414
+ <span class="variable">fn</span>(<span class="variable">err</span>);
415
+ } <span class="keyword">else</span> {
416
+ <span class="keyword">try</span> {
417
+ <span class="variable">less</span>.<span class="variable">render</span>(<span class="variable">str</span>, <span class="variable">fn</span>);
418
+ } <span class="keyword">catch</span> (<span class="variable">err</span>) {
419
+ <span class="variable">fn</span>(<span class="variable">err</span>);
420
+ }
421
+ }
422
+ });
423
+ }
424
+ }
425
+ };</code></pre>
426
+ </td>
427
+ </tr>
428
+ <tr class="code">
429
+ <td class="docs">
430
+ <p>Setup compiler.</p>
431
+
432
+ <h2>Options</h2>
433
+
434
+ <ul><li><code>src</code> Source directory, defaults to <strong>CWD</strong>.</li><li><code>dest</code> Destination directory, defaults <code>src</code>.</li><li><code>enable</code> Array of enabled compilers.</li></ul>
435
+
436
+ <h2>Compilers</h2>
437
+
438
+ <ul><li><code>sass</code> Compiles cass to css</li><li><code>less</code> Compiles less to css</li></ul>
439
+
440
+ <h2></h2>
441
+
442
+ <ul><li><p><strong>param</strong>: <em>Object</em> options</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
443
+ </td>
444
+ <td class="code">
445
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">compiler</span>(<span class="variable">options</span>){
446
+ <span class="variable">options</span> = <span class="variable">options</span> || {};
447
+
448
+ <span class="keyword">var</span> <span class="variable">srcDir</span> = <span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">compilerSrc</span> || <span class="variable">options</span>.<span class="variable">src</span> || <span class="variable">process</span>.<span class="variable">cwd</span>(),
449
+ <span class="variable">destDir</span> = <span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">compilerDest</span> || <span class="variable">options</span>.<span class="variable">dest</span> || <span class="variable">srcDir</span>,
450
+ <span class="variable">enable</span> = <span class="variable">options</span>.<span class="variable">enable</span>;
451
+
452
+ <span class="keyword">if</span> (!<span class="variable">enable</span> || <span class="variable">enable</span>.<span class="variable">length</span> === <span class="number integer">0</span>) {
453
+ <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="variable">s</span> &<span class="variable">quot</span>;<span class="variable">enable</span>&<span class="variable">quot</span>; <span class="variable">option</span> <span class="variable">is</span> <span class="variable">not</span> <span class="variable">set</span>, <span class="variable">nothing</span> <span class="variable">will</span> <span class="variable">be</span> <span class="variable">compiled</span>.');
454
+ }
455
+
456
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">compiler</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>){
457
+ <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">enable</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
458
+ <span class="keyword">var</span> <span class="variable">name</span> = <span class="variable">enable</span>[<span class="variable">i</span>],
459
+ <span class="variable">compiler</span> = <span class="variable">compilers</span>[<span class="variable">name</span>];
460
+ <span class="keyword">if</span> (<span class="variable">compiler</span>.<span class="variable">match</span>.<span class="variable">test</span>(<span class="variable">req</span>.<span class="variable">url</span>)) {
461
+ <span class="keyword">var</span> <span class="variable">src</span> = (<span class="variable">srcDir</span> + <span class="variable">req</span>.<span class="variable">url</span>).<span class="variable">replace</span>(<span class="variable">compiler</span>.<span class="variable">match</span>, <span class="variable">compiler</span>.<span class="variable">ext</span>),
462
+ <span class="variable">dest</span> = <span class="variable">destDir</span> + <span class="variable">req</span>.<span class="variable">url</span>;
463
+
464
+ <span class="comment">// Compare mtimes</span>
465
+ <span class="variable">fs</span>.<span class="variable">stat</span>(<span class="variable">src</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">srcStats</span>){
466
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
467
+ <span class="keyword">if</span> (<span class="variable">err</span>.<span class="variable">errno</span> === <span class="variable">process</span>.<span class="class">ENOENT</span>) {
468
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">404</span>, { <span class="string">'Content-Type'</span>: <span class="string">'text/plain'</span> });
469
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="string">'Not Found'</span>);
470
+ } <span class="keyword">else</span> {
471
+ <span class="variable">next</span>(<span class="variable">err</span>);
472
+ }
473
+ } <span class="keyword">else</span> {
474
+ <span class="variable">fs</span>.<span class="variable">stat</span>(<span class="variable">dest</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">destStats</span>){
475
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
476
+ <span class="comment">// Oh snap! it does not exist, compile it</span>
477
+ <span class="keyword">if</span> (<span class="variable">err</span>.<span class="variable">errno</span> === <span class="variable">process</span>.<span class="class">ENOENT</span>) {
478
+ <span class="variable">compile</span>();
479
+ } <span class="keyword">else</span> {
480
+ <span class="variable">next</span>(<span class="variable">err</span>);
481
+ }
482
+ } <span class="keyword">else</span> {
483
+ <span class="comment">// Source has changed, compile it</span>
484
+ <span class="keyword">if</span> (<span class="variable">srcStats</span>.<span class="variable">mtime</span> &<span class="variable">gt</span>; <span class="variable">destStats</span>.<span class="variable">mtime</span>) {
485
+ <span class="variable">compile</span>();
486
+ } <span class="keyword">else</span> {
487
+ <span class="comment">// Defer file serving</span>
488
+ <span class="variable">next</span>();
489
+ }
490
+ }
491
+ })
492
+ }
493
+ });
494
+
495
+ <span class="comment">// Compile to the destination</span>
496
+ <span class="keyword">function</span> <span class="variable">compile</span>() {
497
+ <span class="variable">fs</span>.<span class="variable">readFile</span>(<span class="variable">src</span>, <span class="string">'utf8'</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">str</span>){
498
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
499
+ <span class="variable">next</span>(<span class="variable">err</span>);
500
+ } <span class="keyword">else</span> {
501
+ <span class="variable">compiler</span>.<span class="variable">compile</span>(<span class="variable">str</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">str</span>){
502
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
503
+ <span class="variable">next</span>(<span class="variable">err</span>);
504
+ } <span class="keyword">else</span> {
505
+ <span class="variable">fs</span>.<span class="variable">writeFile</span>(<span class="variable">dest</span>, <span class="variable">str</span>, <span class="string">'utf8'</span>, <span class="keyword">function</span>(<span class="variable">err</span>){
506
+ <span class="variable">next</span>(<span class="variable">err</span>);
507
+ });
508
+ }
509
+ });
510
+ }
511
+ });
512
+ }
513
+ <span class="keyword">return</span>;
514
+ }
515
+ }
516
+ <span class="variable">next</span>();
517
+ };
518
+ };</code></pre>
519
+ </td>
520
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/conditionalGet.js"><a href="#">conditionalGet</a></h2></td><td>lib/connect/middleware/conditionalGet.js</td></tr><tr class="code">
521
+ <td class="docs">
522
+ <p>Conditional GET request support.</p>
523
+
524
+ <h2></h2>
525
+
526
+ <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
527
+ </td>
528
+ <td class="code">
529
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">conditionalGet</span>(){
530
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">conditionalGet</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
531
+ <span class="comment">// Skip all requests that are not conditional gets.</span>
532
+ <span class="keyword">if</span> (!(<span class="variable">req</span>.<span class="variable">method</span> === &<span class="variable">quot</span>;<span class="class">GET</span>&<span class="variable">quot</span>; &<span class="variable">amp</span>;&<span class="variable">amp</span>;
533
+ (<span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="keyword">if</span>-<span class="variable">modified</span>-<span class="variable">since</span>&<span class="variable">quot</span>;] || <span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="keyword">if</span>-<span class="variable">none</span>-<span class="variable">match</span>&<span class="variable">quot</span>;])
534
+ )) {
535
+ <span class="variable">next</span>();
536
+ <span class="keyword">return</span>;
537
+ }
538
+
539
+ <span class="keyword">var</span> <span class="variable">since</span> = <span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="keyword">if</span>-<span class="variable">modified</span>-<span class="variable">since</span>&<span class="variable">quot</span>;],
540
+ <span class="variable">oldEtag</span> = <span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="keyword">if</span>-<span class="variable">none</span>-<span class="variable">match</span>&<span class="variable">quot</span>;],
541
+ <span class="variable">writeHead</span> = <span class="variable">res</span>.<span class="variable">writeHead</span>,
542
+ <span class="variable">write</span> = <span class="variable">res</span>.<span class="variable">write</span>,
543
+ <span class="variable">end</span> = <span class="variable">res</span>.<span class="variable">end</span>;
544
+
545
+ <span class="variable">since</span> = <span class="variable">since</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="class">Date</span>.<span class="variable">parse</span>(<span class="variable">since</span>).<span class="variable">valueOf</span>();
546
+
547
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="keyword">function</span> (<span class="variable">code</span>, <span class="variable">headers</span>) {
548
+ <span class="keyword">var</span> <span class="variable">lastModified</span> = <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Last</span>-<span class="class">Modified</span>&<span class="variable">quot</span>;],
549
+ <span class="variable">etag</span> = <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Etag</span>&<span class="variable">quot</span>;];
550
+ <span class="variable">lastModified</span> = <span class="variable">lastModified</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="class">Date</span>.<span class="variable">parse</span>(<span class="variable">lastModified</span>).<span class="variable">valueOf</span>();
551
+
552
+ <span class="comment">// If there is no match, then move on.</span>
553
+ <span class="keyword">if</span> (!(<span class="variable">code</span> === <span class="number integer">200</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>;
554
+ (<span class="variable">lastModified</span> === <span class="variable">since</span> || <span class="variable">oldEtag</span> === <span class="variable">etag</span>)
555
+ )) {
556
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>;
557
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">code</span>, <span class="variable">headers</span>);
558
+ <span class="keyword">return</span>;
559
+ }
560
+
561
+ <span class="comment">// Ignore writes</span>
562
+ <span class="variable">res</span>.<span class="variable">write</span> = <span class="keyword">function</span> () {};
563
+
564
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="keyword">function</span> () {
565
+ <span class="comment">// Put the original functions back on.</span>
566
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>;
567
+ <span class="variable">res</span>.<span class="variable">write</span> = <span class="variable">write</span>;
568
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="variable">end</span>;
569
+
570
+ <span class="comment">// Filter out any Content based headers since there is no</span>
571
+ <span class="comment">// content.</span>
572
+ <span class="keyword">var</span> <span class="variable">newHeaders</span> = {};
573
+ <span class="variable">headers</span>.<span class="variable">forEach</span>(<span class="keyword">function</span> (<span class="variable">value</span>, <span class="variable">key</span>) {
574
+ <span class="keyword">if</span> (<span class="variable">key</span>.<span class="variable">indexOf</span>(&<span class="variable">quot</span>;<span class="class">Content</span>&<span class="variable">quot</span>;) &<span class="variable">lt</span>; <span class="number integer">0</span>) {
575
+ <span class="variable">newHeaders</span>[<span class="variable">key</span>] = <span class="variable">value</span>;
576
+ }
577
+ });
578
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">304</span>, <span class="variable">newHeaders</span>);
579
+ <span class="variable">res</span>.<span class="variable">end</span>();
580
+ };
581
+ };
582
+
583
+ <span class="variable">next</span>();
584
+ };
585
+ };</code></pre>
586
+ </td>
587
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/cookieDecoder.js"><a href="#">cookieDecoder</a></h2></td><td>lib/connect/middleware/cookieDecoder.js</td></tr><tr class="code">
588
+ <td class="docs">
589
+ <p>Module dependencies.
590
+ </p>
591
+ </td>
592
+ <td class="code">
593
+ <pre><code><span class="keyword">var</span> <span class="variable">utils</span> = <span class="variable">require</span>(<span class="string">'./../utils'</span>);</code></pre>
594
+ </td>
595
+ </tr>
596
+ <tr class="code">
597
+ <td class="docs">
598
+ <p>Parse <em>Cookie</em> header and populate <code>req.cookies</code>.</p>
599
+
600
+ <h2></h2>
601
+
602
+ <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
603
+ </td>
604
+ <td class="code">
605
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">cookieDecoder</span>(){
606
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">cookieDecoder</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
607
+ <span class="keyword">var</span> <span class="variable">cookie</span> = <span class="variable">req</span>.<span class="variable">headers</span>.<span class="variable">cookie</span>;
608
+ <span class="variable">req</span>.<span class="variable">cookies</span> = {};
609
+ <span class="keyword">if</span> (<span class="variable">cookie</span>) {
610
+ <span class="keyword">try</span> {
611
+ <span class="variable">req</span>.<span class="variable">cookies</span> = <span class="variable">utils</span>.<span class="variable">parseCookie</span>(<span class="variable">cookie</span>);
612
+ <span class="keyword">delete</span> <span class="variable">req</span>.<span class="variable">headers</span>.<span class="variable">cookie</span>;
613
+ } <span class="keyword">catch</span> (<span class="variable">err</span>) {
614
+ <span class="comment">// Ignore</span>
615
+ }
616
+ <span class="variable">next</span>();
617
+ } <span class="keyword">else</span> {
618
+ <span class="variable">next</span>();
619
+ }
620
+ };
621
+ };</code></pre>
622
+ </td>
623
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/errorHandler.js"><a href="#">errorHandler</a></h2></td><td>lib/connect/middleware/errorHandler.js</td></tr><tr class="code">
624
+ <td class="docs">
625
+ <p>Module dependencies.
626
+ </p>
627
+ </td>
628
+ <td class="code">
629
+ <pre><code><span class="keyword">var</span> <span class="variable">utils</span> = <span class="variable">require</span>(<span class="string">'./../utils'</span>),
630
+ <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>),
631
+ <span class="variable">fs</span> = <span class="variable">require</span>(<span class="string">'fs'</span>);</code></pre>
632
+ </td>
633
+ </tr>
634
+ <tr class="code">
635
+ <td class="docs">
636
+ <p>Setup error handler with the given <code>options</code>.</p>
637
+
638
+ <h2>Options</h2>
639
+
640
+ <ul><li><code>showStack</code> respond with both the error message and stack trace. Defaults to <code>false</code></li><li><code>showMessage</code> respond with the exception message only. Defaults to <code>false</code></li><li><code>dumpExceptions</code> dump exceptions to stderr (without terminating the process). Defaults to <code>false</code></li></ul>
641
+
642
+ <h2></h2>
643
+
644
+ <ul><li><p><strong>param</strong>: <em>Object</em> options</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
645
+ </td>
646
+ <td class="code">
647
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">errorHandler</span>(<span class="variable">options</span>){
648
+ <span class="variable">options</span> = <span class="variable">options</span> || {};
649
+
650
+ <span class="comment">// Defaults</span>
651
+ <span class="keyword">var</span> <span class="variable">showStack</span> = <span class="variable">options</span>.<span class="variable">showStack</span>,
652
+ <span class="variable">showMessage</span> = <span class="variable">options</span>.<span class="variable">showMessage</span>,
653
+ <span class="variable">dumpExceptions</span> = <span class="variable">options</span>.<span class="variable">dumpExceptions</span>;
654
+
655
+ <span class="comment">// --showErrorStack</span>
656
+ <span class="keyword">if</span> (<span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">showErrorStack</span> !== <span class="variable">undefined</span>) {
657
+ <span class="variable">showStack</span> = <span class="variable">op</span> = <span class="variable">utils</span>.<span class="variable">toBoolean</span>(<span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">showErrorStack</span>);
658
+ }
659
+
660
+ <span class="comment">// --showErrorMessage</span>
661
+ <span class="keyword">if</span> (<span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">showErrorMessage</span> !== <span class="variable">undefined</span>) {
662
+ <span class="variable">showMessage</span> = <span class="variable">utils</span>.<span class="variable">toBoolean</span>(<span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">showErrorMessage</span>);
663
+ }
664
+
665
+ <span class="comment">// --dumpExceptions</span>
666
+ <span class="keyword">if</span> (<span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">dumpExceptions</span> !== <span class="variable">undefined</span>) {
667
+ <span class="variable">dumpExceptions</span> = <span class="variable">utils</span>.<span class="variable">toBoolean</span>(<span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">dumpExceptions</span>);
668
+ }
669
+
670
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">errorHandler</span>(<span class="variable">err</span>, <span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>){
671
+ <span class="keyword">if</span> (<span class="variable">dumpExceptions</span>) {
672
+ <span class="variable">sys</span>.<span class="variable">error</span>(<span class="variable">err</span>.<span class="variable">stack</span>);
673
+ }
674
+ <span class="keyword">if</span> (<span class="variable">showStack</span>) {
675
+ <span class="keyword">var</span> <span class="variable">accept</span> = <span class="variable">req</span>.<span class="variable">headers</span>.<span class="variable">accept</span> || <span class="string">''</span>;
676
+ <span class="keyword">if</span> (<span class="variable">accept</span>.<span class="variable">indexOf</span>(<span class="string">'html'</span>) !== -<span class="number integer">1</span>) {
677
+ <span class="variable">fs</span>.<span class="variable">readFile</span>(<span class="variable">__dirname</span> + <span class="string">'/../public/style.css'</span>, <span class="keyword">function</span>(<span class="variable">e</span>, <span class="variable">style</span>){
678
+ <span class="variable">style</span> = <span class="variable">style</span>.<span class="variable">toString</span>(<span class="string">'ascii'</span>);
679
+ <span class="variable">fs</span>.<span class="variable">readFile</span>(<span class="variable">__dirname</span> + <span class="string">'/../public/error.html'</span>, <span class="keyword">function</span>(<span class="variable">e</span>, <span class="variable">html</span>){
680
+ <span class="keyword">var</span> <span class="variable">stack</span> = <span class="variable">err</span>.<span class="variable">stack</span>
681
+ .<span class="variable">split</span>(<span class="string">'\n'</span>).<span class="variable">slice</span>(<span class="number integer">1</span>)
682
+ .<span class="variable">map</span>(<span class="keyword">function</span>(<span class="variable">v</span>){ <span class="keyword">return</span> <span class="string">'&lt;li&gt;'</span> + <span class="variable">v</span> + <span class="string">'&lt;/li&gt;'</span>; }).<span class="variable">join</span>(<span class="string">''</span>);
683
+ <span class="variable">html</span> = <span class="variable">html</span>
684
+ .<span class="variable">toString</span>(<span class="string">'utf8'</span>)
685
+ .<span class="variable">replace</span>(<span class="string">'{style}'</span>, <span class="variable">style</span>)
686
+ .<span class="variable">replace</span>(<span class="string">'{stack}'</span>, <span class="variable">stack</span>)
687
+ .<span class="variable">replace</span>(<span class="regexp">/\{error\}/g</span>, <span class="variable">err</span>.<span class="variable">toString</span>());
688
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">500</span>, { <span class="string">'Content-Type'</span>: <span class="string">'text/html'</span> });
689
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">html</span>);
690
+ });
691
+ });
692
+ } <span class="keyword">else</span> <span class="keyword">if</span> (<span class="variable">accept</span>.<span class="variable">indexOf</span>(<span class="string">'json'</span>) !== -<span class="number integer">1</span>) {
693
+ <span class="keyword">var</span> <span class="variable">json</span> = <span class="class">JSON</span>.<span class="variable">stringify</span>({ <span class="variable">error</span>: <span class="variable">err</span> });
694
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">500</span>, { <span class="string">'Content-Type'</span>: <span class="string">'application/json'</span> });
695
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">json</span>);
696
+ } <span class="keyword">else</span> {
697
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">500</span>, { <span class="string">'Content-Type'</span>: <span class="string">'application/json'</span> });
698
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">err</span>.<span class="variable">stack</span>);
699
+ }
700
+ } <span class="keyword">else</span> {
701
+ <span class="keyword">var</span> <span class="variable">body</span> = <span class="variable">showMessage</span>
702
+ ? <span class="variable">err</span>.<span class="variable">toString</span>()
703
+ : <span class="string">'Internal Server Error'</span>;
704
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">500</span>, { <span class="string">'Content-Type'</span>: <span class="string">'text/plain'</span> });
705
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">body</span>);
706
+ }
707
+ };
708
+ };
709
+ </code></pre>
710
+ </td>
711
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/format.js"><a href="#">format</a></h2></td><td>lib/connect/middleware/format.js</td></tr><tr class="code">
712
+ <td class="docs">
713
+ <p>Module dependencies.
714
+ </p>
715
+ </td>
716
+ <td class="code">
717
+ <pre><code><span class="keyword">var</span> <span class="variable">connect</span> = <span class="variable">require</span>(<span class="string">'./../index'</span>),
718
+ <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>);</code></pre>
719
+ </td>
720
+ </tr>
721
+ <tr class="code">
722
+ <td class="docs">
723
+ <p>Extract url "formats" aka extensions from the request
724
+ url, and assigns req.<code>format</code>.</p>
725
+
726
+ <h2>Examples</h2>
727
+
728
+ <pre><code> // curl http://localhost:3000/users.json
729
+ handle: function(req, res, next){
730
+ switch (req.format) {
731
+ case 'json':
732
+ sys.puts(req.url);
733
+ // =&gt; "users"
734
+ // respond with json
735
+ break;
736
+ default:
737
+ // respond with your default format
738
+ }
739
+ }</code></pre>
740
+
741
+ <h2></h2>
742
+
743
+ <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
744
+ </td>
745
+ <td class="code">
746
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">format</span>(){
747
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">format</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
748
+ <span class="keyword">if</span> (<span class="regexp">/\.(\w+)($|#|\?)/</span>.<span class="variable">exec</span>(<span class="variable">req</span>.<span class="variable">url</span>)) {
749
+ <span class="variable">req</span>.<span class="variable">format</span> = <span class="class">RegExp</span>.$<span class="number integer">1</span>;
750
+ <span class="variable">req</span>.<span class="variable">url</span> = <span class="variable">req</span>.<span class="variable">url</span>.<span class="variable">replace</span>(<span class="string">'.'</span> + <span class="variable">req</span>.<span class="variable">format</span>, <span class="string">''</span>);
751
+ }
752
+ <span class="variable">next</span>();
753
+ };
754
+ };</code></pre>
755
+ </td>
756
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/gzip-compress.js"><a href="#">gzip-compress</a></h2></td><td>lib/connect/middleware/gzip-compress.js</td></tr><tr class="code">
757
+ <td class="docs">
758
+ <p>Module dependencies.
759
+ </p>
760
+ </td>
761
+ <td class="code">
762
+ <pre><code><span class="keyword">var</span> <span class="variable">child_process</span> = <span class="variable">require</span>(<span class="string">'child_process'</span>),
763
+ <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>),
764
+ <span class="variable">compress</span> = <span class="variable">require</span>(<span class="string">'compress'</span>);</code></pre>
765
+ </td>
766
+ </tr>
767
+ <tr class="code">
768
+ <td class="docs">
769
+ <p>Provides gzip compression via the node-compress library.</p>
770
+
771
+ <h2></h2>
772
+
773
+ <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
774
+ </td>
775
+ <td class="code">
776
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">gzip</span>(){
777
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">gzip</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
778
+ <span class="keyword">var</span> <span class="variable">writeHead</span> = <span class="variable">res</span>.<span class="variable">writeHead</span>,
779
+ <span class="variable">write</span> = <span class="variable">res</span>.<span class="variable">write</span>,
780
+ <span class="variable">end</span> = <span class="variable">res</span>.<span class="variable">end</span>;
781
+
782
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="keyword">function</span> (<span class="variable">code</span>, <span class="variable">headers</span>) {
783
+ <span class="keyword">var</span> <span class="variable">type</span> = <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Type</span>&<span class="variable">quot</span>;],
784
+ <span class="variable">accept</span> = <span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="variable">accept</span>-<span class="variable">encoding</span>&<span class="variable">quot</span>;];
785
+
786
+ <span class="keyword">if</span> (!(<span class="variable">code</span> === <span class="number integer">200</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">accept</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">accept</span>.<span class="variable">indexOf</span>(<span class="string">'gzip'</span>) &<span class="variable">gt</span>;= <span class="number integer">0</span>
787
+ &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">type</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; (<span class="regexp">/(text|javascript|json)/</span>).<span class="variable">test</span>(<span class="variable">type</span>)
788
+ &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Encoding</span>&<span class="variable">quot</span>;] === <span class="variable">undefined</span>)) {
789
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>;
790
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">code</span>, <span class="variable">headers</span>);
791
+ <span class="keyword">return</span>;
792
+ }
793
+
794
+ <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Encoding</span>&<span class="variable">quot</span>;] = &<span class="variable">quot</span>;<span class="variable">gzip</span>&<span class="variable">quot</span>;;
795
+ <span class="keyword">delete</span> <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Length</span>&<span class="variable">quot</span>;];
796
+
797
+ <span class="keyword">var</span> <span class="variable">gzip</span> = <span class="keyword">new</span> <span class="variable">compress</span>.<span class="class">GzipStream</span>();
798
+
799
+ <span class="variable">res</span>.<span class="variable">write</span> = <span class="keyword">function</span> (<span class="variable">chunk</span>, <span class="variable">encoding</span>) {
800
+ <span class="variable">gzip</span>.<span class="variable">setInputEncoding</span>(<span class="variable">encoding</span>);
801
+ <span class="variable">gzip</span>.<span class="variable">write</span>(<span class="variable">chunk</span>);
802
+ };
803
+
804
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="keyword">function</span> (<span class="variable">chunk</span>, <span class="variable">encoding</span>) {
805
+ <span class="keyword">if</span> (<span class="variable">chunk</span>) {
806
+ <span class="variable">res</span>.<span class="variable">write</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>);
807
+ }
808
+ <span class="variable">gzip</span>.<span class="variable">close</span>();
809
+ };
810
+
811
+ <span class="variable">gzip</span>.<span class="variable">addListener</span>(<span class="string">'data'</span>, <span class="keyword">function</span> (<span class="variable">chunk</span>) {
812
+ <span class="variable">write</span>.<span class="variable">call</span>(<span class="variable">res</span>, <span class="variable">chunk</span>);
813
+ });
814
+ <span class="variable">gzip</span>.<span class="variable">addListener</span>(<span class="string">'error'</span>, <span class="keyword">function</span>(<span class="variable">err</span>) {
815
+ <span class="variable">res</span>.<span class="variable">write</span> = <span class="variable">write</span>;
816
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="variable">end</span>;
817
+ <span class="variable">next</span>(<span class="variable">err</span>);
818
+ });
819
+ <span class="variable">gzip</span>.<span class="variable">addListener</span>(<span class="string">'end'</span>, <span class="keyword">function</span> (<span class="variable">code</span>) {
820
+ <span class="variable">res</span>.<span class="variable">write</span> = <span class="variable">write</span>;
821
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="variable">end</span>;
822
+ <span class="variable">res</span>.<span class="variable">end</span>();
823
+ });
824
+
825
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>;
826
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">code</span>, <span class="variable">headers</span>);
827
+
828
+ };
829
+
830
+ <span class="variable">next</span>();
831
+ };
832
+ };</code></pre>
833
+ </td>
834
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/gzip-proc.js"><a href="#">gzip-proc</a></h2></td><td>lib/connect/middleware/gzip-proc.js</td></tr><tr class="code">
835
+ <td class="docs">
836
+ <p>Module dependencies.
837
+ </p>
838
+ </td>
839
+ <td class="code">
840
+ <pre><code><span class="keyword">var</span> <span class="variable">child_process</span> = <span class="variable">require</span>(<span class="string">'child_process'</span>),
841
+ <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>);</code></pre>
842
+ </td>
843
+ </tr>
844
+ <tr class="code">
845
+ <td class="docs">
846
+ <p>Provides gzip compression via the <code>gzip</code> executable.</p>
847
+
848
+ <h2></h2>
849
+
850
+ <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
851
+ </td>
852
+ <td class="code">
853
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">gzip</span>(){
854
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">gzip</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
855
+ <span class="keyword">var</span> <span class="variable">writeHead</span> = <span class="variable">res</span>.<span class="variable">writeHead</span>,
856
+ <span class="variable">write</span> = <span class="variable">res</span>.<span class="variable">write</span>,
857
+ <span class="variable">end</span> = <span class="variable">res</span>.<span class="variable">end</span>;
858
+
859
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="keyword">function</span> (<span class="variable">code</span>, <span class="variable">headers</span>) {
860
+ <span class="keyword">var</span> <span class="variable">type</span> = <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Type</span>&<span class="variable">quot</span>;],
861
+ <span class="variable">accept</span> = <span class="variable">req</span>.<span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="variable">accept</span>-<span class="variable">encoding</span>&<span class="variable">quot</span>;];
862
+
863
+ <span class="keyword">if</span> (!(<span class="variable">code</span> === <span class="number integer">200</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">accept</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">accept</span>.<span class="variable">indexOf</span>(<span class="string">'gzip'</span>) &<span class="variable">gt</span>;= <span class="number integer">0</span>
864
+ &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">type</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; (<span class="regexp">/(text|javascript|json)/</span>).<span class="variable">test</span>(<span class="variable">type</span>)
865
+ &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Encoding</span>&<span class="variable">quot</span>;] === <span class="variable">undefined</span>)) {
866
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>;
867
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">code</span>, <span class="variable">headers</span>);
868
+ <span class="keyword">return</span>;
869
+ }
870
+
871
+ <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Encoding</span>&<span class="variable">quot</span>;] = &<span class="variable">quot</span>;<span class="variable">gzip</span>&<span class="variable">quot</span>;;
872
+ <span class="keyword">delete</span> <span class="variable">headers</span>[&<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Length</span>&<span class="variable">quot</span>;];
873
+
874
+ <span class="keyword">var</span> <span class="variable">gzip</span> = <span class="variable">child_process</span>.<span class="variable">spawn</span>(&<span class="variable">quot</span>;<span class="variable">gzip</span>&<span class="variable">quot</span>;, [&<span class="variable">quot</span>;-<span class="number integer">9</span>&<span class="variable">quot</span>;]);
875
+
876
+ <span class="variable">res</span>.<span class="variable">write</span> = <span class="keyword">function</span> (<span class="variable">chunk</span>, <span class="variable">encoding</span>) {
877
+ <span class="variable">gzip</span>.<span class="variable">stdin</span>.<span class="variable">write</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>);
878
+ };
879
+
880
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="keyword">function</span> (<span class="variable">chunk</span>, <span class="variable">encoding</span>) {
881
+ <span class="keyword">if</span> (<span class="variable">chunk</span>) {
882
+ <span class="variable">res</span>.<span class="variable">write</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>);
883
+ }
884
+ <span class="variable">gzip</span>.<span class="variable">stdin</span>.<span class="variable">end</span>();
885
+ };
886
+
887
+ <span class="variable">gzip</span>.<span class="variable">stdout</span>.<span class="variable">addListener</span>(<span class="string">'data'</span>, <span class="keyword">function</span> (<span class="variable">chunk</span>) {
888
+ <span class="variable">write</span>.<span class="variable">call</span>(<span class="variable">res</span>, <span class="variable">chunk</span>);
889
+ });
890
+
891
+ <span class="variable">gzip</span>.<span class="variable">addListener</span>(&<span class="variable">quot</span>;<span class="variable">exit</span>&<span class="variable">quot</span>;, <span class="keyword">function</span> (<span class="variable">code</span>) {
892
+ <span class="variable">res</span>.<span class="variable">write</span> = <span class="variable">write</span>;
893
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="variable">end</span>;
894
+ <span class="variable">res</span>.<span class="variable">end</span>();
895
+ });
896
+
897
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>;
898
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">code</span>, <span class="variable">headers</span>);
899
+
900
+ };
901
+
902
+ <span class="variable">next</span>();
903
+ };
904
+ };
905
+ </code></pre>
906
+ </td>
907
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/gzip.js"><a href="#">gzip</a></h2></td><td>lib/connect/middleware/gzip.js</td></tr><tr class="code">
908
+ <td class="docs">
909
+ <p>try {
910
+ module.exports = require('./gzip-compress');
911
+ } catch (e) {
912
+ if (/^Cannot find module /.test(e.message))
913
+ module.exports = require('./gzip-proc');
914
+ else
915
+ throw e;
916
+ }</p>
917
+ </td>
918
+ <td class="code">
919
+
920
+ </td>
921
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/jsonrpc.js"><a href="#">jsonrpc</a></h2></td><td>lib/connect/middleware/jsonrpc.js</td></tr><tr class="code">
922
+ <td class="docs">
923
+ <p>Module dependencies.
924
+ </p>
925
+ </td>
926
+ <td class="code">
927
+ <pre><code><span class="keyword">var</span> <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>),
928
+ <span class="variable">parse</span> = <span class="variable">require</span>(<span class="string">'url'</span>).<span class="variable">parse</span>,
929
+ <span class="class">Buffer</span> = <span class="variable">require</span>(<span class="string">'buffer'</span>).<span class="class">Buffer</span>,
930
+ <span class="variable">http</span> = <span class="variable">require</span>(<span class="string">'http'</span>);</code></pre>
931
+ </td>
932
+ </tr>
933
+ <tr class="code">
934
+ <td class="docs">
935
+ <p>Export the <code>setup()</code> function.
936
+ </p>
937
+ </td>
938
+ <td class="code">
939
+ <pre><code><span class="variable">exports</span> = <span class="variable">module</span>.<span class="variable">exports</span> = <span class="variable">jsonrpc</span>;</code></pre>
940
+ </td>
941
+ </tr>
942
+ <tr class="code">
943
+ <td class="docs">
944
+ <p>JSON-RPC version.
945
+ </p>
946
+ </td>
947
+ <td class="code">
948
+ <pre><code><span class="keyword">var</span> <span class="class">VERSION</span> = <span class="variable">exports</span>.<span class="class">VERSION</span> = <span class="string">'2.0'</span>;</code></pre>
949
+ </td>
950
+ </tr>
951
+ <tr class="code">
952
+ <td class="docs">
953
+ <p>JSON parse error.
954
+ </p>
955
+ </td>
956
+ <td class="code">
957
+ <pre><code><span class="keyword">var</span> <span class="class">PARSE_ERROR</span> = <span class="variable">exports</span>.<span class="class">PARSE_ERROR</span> = -<span class="number integer">32700</span>;</code></pre>
958
+ </td>
959
+ </tr>
960
+ <tr class="code">
961
+ <td class="docs">
962
+ <p>Invalid request due to invalid or missing properties.
963
+ </p>
964
+ </td>
965
+ <td class="code">
966
+ <pre><code><span class="keyword">var</span> <span class="class">INVALID_REQUEST</span> = <span class="variable">exports</span>.<span class="class">INVALID_REQUEST</span> = -<span class="number integer">32600</span>;</code></pre>
967
+ </td>
968
+ </tr>
969
+ <tr class="code">
970
+ <td class="docs">
971
+ <p>Service method does not exist.
972
+ </p>
973
+ </td>
974
+ <td class="code">
975
+ <pre><code><span class="keyword">var</span> <span class="class">METHOD_NOT_FOUND</span> = <span class="variable">exports</span>.<span class="class">METHOD_NOT_FOUND</span> = -<span class="number integer">32601</span>;</code></pre>
976
+ </td>
977
+ </tr>
978
+ <tr class="code">
979
+ <td class="docs">
980
+ <p>Invalid parameters.
981
+ </p>
982
+ </td>
983
+ <td class="code">
984
+ <pre><code><span class="keyword">var</span> <span class="class">INVALID_PARAMS</span> = <span class="variable">exports</span>.<span class="class">INVALID_PARAMS</span> = -<span class="number integer">32602</span>;</code></pre>
985
+ </td>
986
+ </tr>
987
+ <tr class="code">
988
+ <td class="docs">
989
+ <p>Internal JSON-RPC error.
990
+ </p>
991
+ </td>
992
+ <td class="code">
993
+ <pre><code><span class="keyword">var</span> <span class="class">INTERNAL_ERROR</span> = <span class="variable">exports</span>.<span class="class">INTERNAL_ERROR</span> = -<span class="number integer">32603</span>;</code></pre>
994
+ </td>
995
+ </tr>
996
+ <tr class="code">
997
+ <td class="docs">
998
+ <p>Default error messages.
999
+ </p>
1000
+ </td>
1001
+ <td class="code">
1002
+ <pre><code><span class="keyword">var</span> <span class="variable">errorMessages</span> = <span class="variable">exports</span>.<span class="variable">errorMessages</span> = {};
1003
+ <span class="variable">errorMessages</span>[<span class="class">PARSE_ERROR</span>] = <span class="string">'Parse Error.'</span>;
1004
+ <span class="variable">errorMessages</span>[<span class="class">INVALID_REQUEST</span>] = <span class="string">'Invalid Request.'</span>;
1005
+ <span class="variable">errorMessages</span>[<span class="class">METHOD_NOT_FOUND</span>] = <span class="string">'Method Not Found.'</span>;
1006
+ <span class="variable">errorMessages</span>[<span class="class">INVALID_PARAMS</span>] = <span class="string">'Invalid Params.'</span>;
1007
+ <span class="variable">errorMessages</span>[<span class="class">INTERNAL_ERROR</span>] = <span class="string">'Internal Error.'</span>;</code></pre>
1008
+ </td>
1009
+ </tr>
1010
+ <tr class="code">
1011
+ <td class="docs">
1012
+ <p>Accepts any number of objects, exposing their methods.</p>
1013
+
1014
+ <h2></h2>
1015
+
1016
+ <ul><li><p><strong>param</strong>: <em>Object</em> ...</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1017
+ </td>
1018
+ <td class="code">
1019
+ <pre><code><span class="keyword">function</span> <span class="variable">jsonrpc</span>(<span class="variable">services</span>) {
1020
+ <span class="variable">services</span> = <span class="variable">services</span> || {};
1021
+
1022
+ <span class="comment">// Merge methods</span>
1023
+ <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">arguments</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
1024
+ <span class="variable">arguments</span>[<span class="variable">i</span>].<span class="variable">forEach</span>(<span class="keyword">function</span>(<span class="variable">val</span>, <span class="variable">key</span>){
1025
+ <span class="variable">services</span>[<span class="variable">key</span>] = <span class="variable">val</span>;
1026
+ });
1027
+ }</code></pre>
1028
+ </td>
1029
+ </tr>
1030
+ <tr class="code">
1031
+ <td class="docs">
1032
+ <p>Handle JSON-RPC request.</p>
1033
+
1034
+ <h2></h2>
1035
+
1036
+ <ul><li><p><strong>param</strong>: <em>Object</em> rpc</p></li><li><p><strong>param</strong>: <em>Function</em> respond</p><p> </p></li></ul>
1037
+ </td>
1038
+ <td class="code">
1039
+ <pre><code><span class="keyword">function</span> <span class="variable">handleRequest</span>(<span class="variable">rpc</span>, <span class="variable">respond</span>){
1040
+ <span class="keyword">if</span> (<span class="variable">validRequest</span>(<span class="variable">rpc</span>)) {
1041
+ <span class="keyword">var</span> <span class="variable">method</span> = <span class="variable">services</span>[<span class="variable">rpc</span>.<span class="variable">method</span>];
1042
+ <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">method</span> === <span class="string">'function'</span>) {
1043
+ <span class="keyword">var</span> <span class="variable">params</span> = [];
1044
+ <span class="keyword">if</span> (<span class="variable">rpc</span>.<span class="variable">params</span> <span class="variable">instanceof</span> <span class="class">Array</span>) {
1045
+ <span class="variable">params</span> = <span class="variable">rpc</span>.<span class="variable">params</span>;
1046
+ } <span class="keyword">else</span> <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">rpc</span>.<span class="variable">params</span> === <span class="string">'object'</span>) {
1047
+ <span class="keyword">var</span> <span class="variable">names</span> = <span class="variable">method</span>.<span class="variable">toString</span>().<span class="variable">match</span>(<span class="regexp">/\((.*?)\)/</span>)[<span class="number integer">1</span>].<span class="variable">match</span>(<span class="regexp">/[\w]+/g</span>);
1048
+ <span class="keyword">if</span> (<span class="variable">names</span>) {
1049
+ <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">names</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
1050
+ <span class="variable">params</span>.<span class="variable">push</span>(<span class="variable">rpc</span>.<span class="variable">params</span>[<span class="variable">names</span>[<span class="variable">i</span>]]);
1051
+ }
1052
+ } <span class="keyword">else</span> {
1053
+ <span class="comment">// Function does not have named parameters</span>
1054
+ <span class="keyword">return</span> <span class="variable">respond</span>({ <span class="variable">error</span>: { <span class="variable">code</span>: <span class="class">INVALID_PARAMS</span>, <span class="variable">message</span>: <span class="string">'This service does not support named parameters.'</span> }});
1055
+ }
1056
+ }
1057
+ <span class="keyword">function</span> <span class="variable">reply</span>(<span class="variable">err</span>, <span class="variable">result</span>){
1058
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
1059
+ <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">err</span> === <span class="string">'number'</span>) {
1060
+ <span class="variable">respond</span>({
1061
+ <span class="variable">error</span>: {
1062
+ <span class="variable">code</span>: <span class="variable">err</span>
1063
+ }
1064
+ });
1065
+ } <span class="keyword">else</span> {
1066
+ <span class="variable">respond</span>({
1067
+ <span class="variable">error</span>: {
1068
+ <span class="variable">code</span>: <span class="variable">err</span>.<span class="variable">code</span> || <span class="class">INTERNAL_ERROR</span>,
1069
+ <span class="variable">message</span>: <span class="variable">err</span>.<span class="variable">message</span>
1070
+ }
1071
+ });
1072
+ }
1073
+ } <span class="keyword">else</span> {
1074
+ <span class="variable">respond</span>({
1075
+ <span class="variable">result</span>: <span class="variable">result</span>
1076
+ });
1077
+ }
1078
+ }
1079
+ <span class="variable">method</span>.<span class="variable">apply</span>(<span class="variable">reply</span>, <span class="variable">params</span>);
1080
+ } <span class="keyword">else</span> {
1081
+ <span class="variable">respond</span>({ <span class="variable">error</span>: { <span class="variable">code</span>: <span class="class">METHOD_NOT_FOUND</span> }});
1082
+ }
1083
+ } <span class="keyword">else</span> {
1084
+ <span class="variable">respond</span>({ <span class="variable">error</span>: { <span class="variable">code</span>: <span class="class">INVALID_REQUEST</span> }});
1085
+ }
1086
+ }
1087
+
1088
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">jsonrpc</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
1089
+ <span class="keyword">var</span> <span class="variable">me</span> = <span class="this">this</span>,
1090
+ <span class="variable">contentType</span> = <span class="variable">req</span>.<span class="variable">headers</span>[<span class="string">'content-type'</span>] || <span class="string">''</span>;
1091
+ <span class="keyword">if</span> (<span class="variable">req</span>.<span class="variable">method</span> === <span class="string">'POST'</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">contentType</span>.<span class="variable">indexOf</span>(<span class="string">'application/json'</span>) &<span class="variable">gt</span>;= <span class="number integer">0</span>) {
1092
+ <span class="keyword">var</span> <span class="variable">data</span> = <span class="string">''</span>;
1093
+ <span class="variable">req</span>.<span class="variable">setEncoding</span>(<span class="string">'utf8'</span>);
1094
+ <span class="variable">req</span>.<span class="variable">addListener</span>(<span class="string">'data'</span>, <span class="keyword">function</span>(<span class="variable">chunk</span>) { <span class="variable">data</span> += <span class="variable">chunk</span>; });
1095
+ <span class="variable">req</span>.<span class="variable">addListener</span>(<span class="string">'end'</span>, <span class="keyword">function</span>() {
1096
+
1097
+ <span class="comment">// Attempt to parse incoming JSON string</span>
1098
+
1099
+ <span class="keyword">try</span> {
1100
+ <span class="keyword">var</span> <span class="variable">rpc</span> = <span class="class">JSON</span>.<span class="variable">parse</span>(<span class="variable">data</span>),
1101
+ <span class="variable">batch</span> = <span class="variable">rpc</span> <span class="variable">instanceof</span> <span class="class">Array</span>;
1102
+ } <span class="keyword">catch</span> (<span class="variable">err</span>) {
1103
+ <span class="keyword">return</span> <span class="variable">respond</span>(<span class="variable">normalize</span>(<span class="variable">rpc</span>, { <span class="variable">error</span>: { <span class="variable">code</span>: <span class="class">PARSE_ERROR</span> }}));
1104
+ }</code></pre>
1105
+ </td>
1106
+ </tr>
1107
+ <tr class="code">
1108
+ <td class="docs">
1109
+ <p>Normalize response object.
1110
+ </p>
1111
+ </td>
1112
+ <td class="code">
1113
+ <pre><code><span class="keyword">function</span> <span class="variable">normalize</span>(<span class="variable">rpc</span>, <span class="variable">obj</span>) {
1114
+ <span class="variable">obj</span>.<span class="variable">id</span> = <span class="variable">rpc</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="keyword">typeof</span> <span class="variable">rpc</span>.<span class="variable">id</span> === <span class="string">'number'</span>
1115
+ ? <span class="variable">rpc</span>.<span class="variable">id</span>
1116
+ : <span class="keyword">null</span>;
1117
+ <span class="variable">obj</span>.<span class="variable">jsonrpc</span> = <span class="class">VERSION</span>;
1118
+ <span class="keyword">if</span> (<span class="variable">obj</span>.<span class="variable">error</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; !<span class="variable">obj</span>.<span class="variable">error</span>.<span class="variable">message</span>) {
1119
+ <span class="variable">obj</span>.<span class="variable">error</span>.<span class="variable">message</span> = <span class="variable">errorMessages</span>[<span class="variable">obj</span>.<span class="variable">error</span>.<span class="variable">code</span>];
1120
+ }
1121
+ <span class="keyword">return</span> <span class="variable">obj</span>;
1122
+ }</code></pre>
1123
+ </td>
1124
+ </tr>
1125
+ <tr class="code">
1126
+ <td class="docs">
1127
+ <p>Respond with the given response object.
1128
+ </p>
1129
+ </td>
1130
+ <td class="code">
1131
+ <pre><code><span class="keyword">function</span> <span class="variable">respond</span>(<span class="variable">obj</span>) {
1132
+ <span class="keyword">var</span> <span class="variable">body</span> = <span class="class">JSON</span>.<span class="variable">stringify</span>(<span class="variable">obj</span>);
1133
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">200</span>, {
1134
+ <span class="string">'Content-Type'</span>: <span class="string">'application/json'</span>,
1135
+ <span class="string">'Content-Length'</span>: <span class="class">Buffer</span>.<span class="variable">byteLength</span>(<span class="variable">body</span>)
1136
+ });
1137
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">body</span>);
1138
+ }
1139
+
1140
+ <span class="comment">// Handle requests</span>
1141
+
1142
+ <span class="keyword">if</span> (<span class="variable">batch</span>) {
1143
+ <span class="keyword">var</span> <span class="variable">responses</span> = [],
1144
+ <span class="variable">len</span> = <span class="variable">rpc</span>.<span class="variable">length</span>,
1145
+ <span class="variable">pending</span> = <span class="variable">len</span>;
1146
+ <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
1147
+ (<span class="keyword">function</span>(<span class="variable">rpc</span>){
1148
+ <span class="variable">handleRequest</span>.<span class="variable">call</span>(<span class="variable">me</span>, <span class="variable">rpc</span>, <span class="keyword">function</span>(<span class="variable">obj</span>){
1149
+ <span class="variable">responses</span>.<span class="variable">push</span>(<span class="variable">normalize</span>(<span class="variable">rpc</span>, <span class="variable">obj</span>));
1150
+ <span class="keyword">if</span> (!--<span class="variable">pending</span>) {
1151
+ <span class="variable">respond</span>(<span class="variable">responses</span>);
1152
+ }
1153
+ });
1154
+ })(<span class="variable">rpc</span>[<span class="variable">i</span>]);
1155
+ }
1156
+ } <span class="keyword">else</span> {
1157
+ <span class="variable">handleRequest</span>.<span class="variable">call</span>(<span class="variable">me</span>, <span class="variable">rpc</span>, <span class="keyword">function</span>(<span class="variable">obj</span>){
1158
+ <span class="variable">respond</span>(<span class="variable">normalize</span>(<span class="variable">rpc</span>, <span class="variable">obj</span>));
1159
+ });
1160
+ }
1161
+ });
1162
+ } <span class="keyword">else</span> {
1163
+ <span class="variable">next</span>();
1164
+ }
1165
+ };
1166
+ };</code></pre>
1167
+ </td>
1168
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/lint.js"><a href="#">lint</a></h2></td><td>lib/connect/middleware/lint.js</td></tr><tr class="code">
1169
+ <td class="docs">
1170
+ <p>Module dependencies.
1171
+ </p>
1172
+ </td>
1173
+ <td class="code">
1174
+ <pre><code><span class="keyword">var</span> <span class="variable">connect</span> = <span class="variable">require</span>(<span class="string">'./../index'</span>),
1175
+ <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>);</code></pre>
1176
+ </td>
1177
+ </tr>
1178
+ <tr class="code">
1179
+ <td class="docs">
1180
+ <p>Setup lint for the given <code>server</code>.</p>
1181
+
1182
+ <h2></h2>
1183
+
1184
+ <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1185
+ </td>
1186
+ <td class="code">
1187
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">lint</span>(<span class="variable">server</span>){
1188
+
1189
+ <span class="comment">// Ensure a server is passed</span>
1190
+ <span class="keyword">if</span> (!<span class="variable">server</span>) {
1191
+ <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'lint &quot;server&quot; must be passed.'</span>);
1192
+ }
1193
+
1194
+ <span class="comment">// Warn unless in development mode</span>
1195
+ <span class="keyword">if</span> (<span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">name</span> !== <span class="string">'development'</span>) {
1196
+ <span class="variable">warn</span>(<span class="string">'&quot;lint&quot; middleware should never be enabled outside of the development environment'</span>);
1197
+ }
1198
+
1199
+ <span class="comment">// Check the stack</span>
1200
+ <span class="variable">checkStack</span>(<span class="variable">server</span>.<span class="variable">stack</span>);
1201
+
1202
+ <span class="comment">// Do nothing</span>
1203
+ <span class="keyword">return</span> <span class="keyword">function</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>){
1204
+ <span class="variable">next</span>();
1205
+ }
1206
+ };</code></pre>
1207
+ </td>
1208
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/logger.js"><a href="#">logger</a></h2></td><td>lib/connect/middleware/logger.js</td></tr><tr class="code">
1209
+ <td class="docs">
1210
+ <p>Log requests with the given <code>options</code>.</p>
1211
+
1212
+ <h2>Options</h2>
1213
+
1214
+ <ul><li><code>format</code> Format string, see below for tokens</li><li><code>stream</code> Output stream, defaults to <em>stdout</em></li></ul>
1215
+
1216
+ <h2>Tokens</h2>
1217
+
1218
+ <ul><li><code>:req[header]</code> ex: <code>:req[Accept]</code></li><li><code>:res[header]</code> ex: <code>:res[Content-Length]</code></li><li><code>:http-version</code></li><li><code>:response-time</code></li><li><code>:remote-addr</code></li><li><code>:date</code></li><li><code>:method</code></li><li><code>:url</code></li><li><code>:referrer</code></li><li><code>:user-agent</code></li><li><code>:status</code></li></ul>
1219
+
1220
+ <h2></h2>
1221
+
1222
+ <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1223
+ </td>
1224
+ <td class="code">
1225
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">logger</span>(<span class="variable">options</span>) {
1226
+ <span class="variable">options</span> = <span class="variable">options</span> || {};
1227
+
1228
+ <span class="keyword">var</span> <span class="variable">fmt</span> = <span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">logFormat</span> || <span class="variable">options</span>.<span class="variable">format</span>,
1229
+ <span class="variable">stream</span> = <span class="variable">options</span>.<span class="variable">stream</span> || <span class="variable">process</span>.<span class="variable">stdout</span>;
1230
+
1231
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">logger</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
1232
+ <span class="keyword">var</span> <span class="variable">start</span> = +<span class="keyword">new</span> <span class="class">Date</span>,
1233
+ <span class="variable">statusCode</span>,
1234
+ <span class="variable">resHeaders</span>,
1235
+ <span class="variable">writeHead</span> = <span class="variable">res</span>.<span class="variable">writeHead</span>,
1236
+ <span class="variable">end</span> = <span class="variable">res</span>.<span class="variable">end</span>,
1237
+ <span class="variable">url</span> = <span class="variable">req</span>.<span class="variable">url</span>;
1238
+
1239
+ <span class="comment">// Proxy for statusCode.</span>
1240
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="keyword">function</span>(<span class="variable">code</span>, <span class="variable">headers</span>){
1241
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>;
1242
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">code</span>, <span class="variable">headers</span>);
1243
+ <span class="variable">res</span>.<span class="variable">statusCode</span> = <span class="variable">statusCode</span> = <span class="variable">code</span>;
1244
+ <span class="variable">res</span>.<span class="variable">headers</span> = <span class="variable">resHeaders</span> = <span class="variable">headers</span>;
1245
+ };
1246
+
1247
+ <span class="comment">// Proxy end to output a line to the provided logger.</span>
1248
+ <span class="keyword">if</span> (<span class="variable">fmt</span>) {
1249
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="keyword">function</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>) {
1250
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="variable">end</span>;
1251
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>);
1252
+ <span class="variable">res</span>.<span class="variable">responseTime</span> = +<span class="keyword">new</span> <span class="class">Date</span> - <span class="variable">start</span>;
1253
+ <span class="variable">stream</span>.<span class="variable">write</span>(<span class="variable">format</span>(<span class="variable">fmt</span>, <span class="variable">req</span>, <span class="variable">res</span>) + <span class="string">'\n'</span>, <span class="string">'ascii'</span>);
1254
+ };
1255
+ } <span class="keyword">else</span> {
1256
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="keyword">function</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>) {
1257
+ <span class="variable">res</span>.<span class="variable">end</span> = <span class="variable">end</span>;
1258
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">chunk</span>, <span class="variable">encoding</span>);
1259
+
1260
+ <span class="variable">stream</span>.<span class="variable">write</span>((<span class="variable">req</span>.<span class="variable">socket</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">req</span>.<span class="variable">socket</span>.<span class="variable">remoteAddress</span>)
1261
+ + <span class="string">' - - ['</span> + (<span class="keyword">new</span> <span class="class">Date</span>).<span class="variable">toUTCString</span>() + <span class="string">']'</span>
1262
+ + <span class="string">' &quot;'</span> + <span class="variable">req</span>.<span class="variable">method</span> + <span class="string">' '</span> + <span class="variable">url</span>
1263
+ + <span class="string">' HTTP/'</span> + <span class="variable">req</span>.<span class="variable">httpVersionMajor</span> + <span class="string">'.'</span> + <span class="variable">req</span>.<span class="variable">httpVersionMinor</span> + <span class="string">'&quot; '</span>
1264
+ + <span class="variable">statusCode</span> + <span class="string">' '</span> + (<span class="variable">resHeaders</span>[<span class="string">'Content-Length'</span>] || <span class="string">'-'</span>)
1265
+ + <span class="string">' &quot;'</span> + (<span class="variable">req</span>.<span class="variable">headers</span>[<span class="string">'referer'</span>] || <span class="variable">req</span>.<span class="variable">headers</span>[<span class="string">'referrer'</span>] || <span class="string">''</span>)
1266
+ + <span class="string">'&quot; &quot;'</span> + (<span class="variable">req</span>.<span class="variable">headers</span>[<span class="string">'user-agent'</span>] || <span class="string">''</span>) + <span class="string">'&quot;\n'</span>, <span class="string">'ascii'</span>);
1267
+ };
1268
+ }
1269
+
1270
+ <span class="comment">// Fall through to the next layer.</span>
1271
+ <span class="variable">next</span>();
1272
+ };
1273
+
1274
+ };</code></pre>
1275
+ </td>
1276
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/methodOverride.js"><a href="#">methodOverride</a></h2></td><td>lib/connect/middleware/methodOverride.js</td></tr><tr class="code">
1277
+ <td class="docs">
1278
+ <p>Module dependencies.
1279
+ </p>
1280
+ </td>
1281
+ <td class="code">
1282
+ <pre><code><span class="keyword">var</span> <span class="variable">queryString</span> = <span class="variable">require</span>(<span class="string">'querystring'</span>);</code></pre>
1283
+ </td>
1284
+ </tr>
1285
+ <tr class="code">
1286
+ <td class="docs">
1287
+ <p>Valid http methods.</p>
1288
+
1289
+ <ul><li><p><strong>type</strong>: <em>Array</em></p></li></ul>
1290
+ </td>
1291
+ <td class="code">
1292
+ <pre><code><span class="keyword">var</span> <span class="variable">methods</span> = [<span class="string">'GET'</span>, <span class="string">'POST'</span>, <span class="string">'PUT'</span>, <span class="string">'HEAD'</span>, <span class="string">'DELETE'</span>, <span class="string">'OPTIONS'</span>];</code></pre>
1293
+ </td>
1294
+ </tr>
1295
+ <tr class="code">
1296
+ <td class="docs">
1297
+ <p>Pass an optional <code>key</code> to use when checking for
1298
+ a method override, othewise defaults to __method_.</p>
1299
+
1300
+ <h2></h2>
1301
+
1302
+ <ul><li><p><strong>param</strong>: <em>String</em> key</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1303
+ </td>
1304
+ <td class="code">
1305
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">methodOverride</span>(<span class="variable">key</span>){
1306
+ <span class="variable">key</span> = <span class="variable">key</span> || &<span class="variable">quot</span>;<span class="variable">_method</span>&<span class="variable">quot</span>;;
1307
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">methodOverride</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
1308
+ <span class="keyword">var</span> <span class="variable">method</span> = <span class="variable">req</span>.<span class="variable">method</span>;
1309
+
1310
+ <span class="comment">// Check req.body (bodyDecoder)</span>
1311
+ <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">req</span>.<span class="variable">body</span> === <span class="string">'object'</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">key</span> <span class="keyword">in</span> <span class="variable">req</span>.<span class="variable">body</span>) {
1312
+ <span class="variable">method</span> = <span class="variable">req</span>.<span class="variable">body</span>[<span class="variable">key</span>];
1313
+ <span class="keyword">delete</span> <span class="variable">req</span>.<span class="variable">body</span>[<span class="variable">key</span>];
1314
+ <span class="comment">// Check X-HTTP-Method-Override</span>
1315
+ } <span class="keyword">else</span> <span class="keyword">if</span> (<span class="variable">req</span>.<span class="variable">headers</span>[<span class="string">'x-http-method-override'</span>]) {
1316
+ <span class="variable">method</span> = <span class="variable">req</span>.<span class="variable">headers</span>[<span class="string">'x-http-method-override'</span>];
1317
+ }
1318
+
1319
+ <span class="comment">// Ensure method is valid, and normalize</span>
1320
+ <span class="variable">method</span> = <span class="variable">method</span>.<span class="variable">toUpperCase</span>();
1321
+ <span class="keyword">if</span> (<span class="variable">methods</span>.<span class="variable">indexOf</span>(<span class="variable">method</span>) &<span class="variable">gt</span>;= <span class="number integer">0</span>) {
1322
+ <span class="variable">req</span>.<span class="variable">method</span> = <span class="variable">method</span>;
1323
+ }
1324
+
1325
+ <span class="variable">next</span>();
1326
+ };
1327
+ };
1328
+
1329
+ </code></pre>
1330
+ </td>
1331
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/pubsub.js"><a href="#">pubsub</a></h2></td><td>lib/connect/middleware/pubsub.js</td></tr><tr class="code">
1332
+ <td class="docs">
1333
+ <p>Module dependencies.
1334
+ </p>
1335
+ </td>
1336
+ <td class="code">
1337
+ <pre><code><span class="keyword">var</span> <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>);</code></pre>
1338
+ </td>
1339
+ </tr>
1340
+ <tr class="code">
1341
+ <td class="docs">
1342
+ <p>Subscriber cache.
1343
+ </p>
1344
+ </td>
1345
+ <td class="code">
1346
+ <pre><code><span class="keyword">var</span> <span class="variable">cache</span> = {};</code></pre>
1347
+ </td>
1348
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/repl.js"><a href="#">repl</a></h2></td><td>lib/connect/middleware/repl.js</td></tr><tr class="code">
1349
+ <td class="docs">
1350
+ <p>Module dependencies.
1351
+ </p>
1352
+ </td>
1353
+ <td class="code">
1354
+ <pre><code><span class="keyword">var</span> <span class="variable">net</span> = <span class="variable">require</span>(<span class="string">'net'</span>),
1355
+ <span class="variable">repl</span> = <span class="variable">require</span>(<span class="string">'repl'</span>);</code></pre>
1356
+ </td>
1357
+ </tr>
1358
+ <tr class="code">
1359
+ <td class="docs">
1360
+ <p>Start a <strong>REPL</strong> on the given unix domain <code>socket</code> path.</p>
1361
+
1362
+ <h2>Options</h2>
1363
+
1364
+ <ul><li><code>sockect</code> Unix domain socket path. Defaults to "/tmp/connect.sock"</li><li><code>prompt</code> <strong>REPL</strong> prompt string. Defaults to "node&gt; "</li></ul>
1365
+
1366
+ <h2>Example</h2>
1367
+
1368
+ <pre><code>$ rlwrap telnet /tmp/connect.sock</code></pre>
1369
+
1370
+ <h2></h2>
1371
+
1372
+ <ul><li><p><strong>param</strong>: <em>String</em> prompt</p></li><li><p><strong>param</strong>: <em>String</em> socket path</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1373
+ </td>
1374
+ <td class="code">
1375
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">repl</span>(<span class="variable">prompt</span>, <span class="variable">socket</span>){
1376
+ <span class="variable">prompt</span> = <span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">replPrompt</span> || <span class="variable">prompt</span> || <span class="string">'node&gt; '</span>;
1377
+ <span class="variable">socket</span> = <span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">replSocket</span> || <span class="variable">socket</span> || <span class="string">'/tmp/connect.sock'</span>;
1378
+ <span class="variable">net</span>.<span class="variable">createServer</span>(<span class="keyword">function</span> (<span class="variable">stream</span>) {
1379
+ <span class="variable">repl</span>.<span class="variable">start</span>(<span class="variable">prompt</span>, <span class="variable">stream</span>);
1380
+ }).<span class="variable">listen</span>(<span class="variable">socket</span>);
1381
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">repl</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>){
1382
+ <span class="comment">// Pass through for now</span>
1383
+ <span class="variable">next</span>();
1384
+ }
1385
+ };
1386
+ </code></pre>
1387
+ </td>
1388
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/responseTime.js"><a href="#">responseTime</a></h2></td><td>lib/connect/middleware/responseTime.js</td></tr><tr class="code">
1389
+ <td class="docs">
1390
+ <p>Responds with the <em>X-Response-Time</em> header in milliseconds.</p>
1391
+
1392
+ <h2></h2>
1393
+
1394
+ <ul><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1395
+ </td>
1396
+ <td class="code">
1397
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">responseTime</span>(){
1398
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">responseTime</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>){
1399
+ <span class="keyword">var</span> <span class="variable">start</span> = <span class="keyword">new</span> <span class="class">Date</span>,
1400
+ <span class="variable">writeHead</span> = <span class="variable">res</span>.<span class="variable">writeHead</span>;
1401
+
1402
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="keyword">function</span>(<span class="variable">code</span>, <span class="variable">headers</span>){
1403
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>;
1404
+ <span class="variable">headers</span>[<span class="string">'X-Response-Time'</span>] = (<span class="keyword">new</span> <span class="class">Date</span> - <span class="variable">start</span>) + &<span class="variable">quot</span>;<span class="variable">ms</span>&<span class="variable">quot</span>;;
1405
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">code</span>, <span class="variable">headers</span>);
1406
+ };
1407
+
1408
+ <span class="variable">next</span>();
1409
+ };
1410
+ };</code></pre>
1411
+ </td>
1412
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/router.js"><a href="#">router</a></h2></td><td>lib/connect/middleware/router.js</td></tr><tr class="code">
1413
+ <td class="docs">
1414
+ <p>Module dependencies.
1415
+ </p>
1416
+ </td>
1417
+ <td class="code">
1418
+ <pre><code><span class="keyword">var</span> <span class="variable">parse</span> = <span class="variable">require</span>(<span class="string">'url'</span>).<span class="variable">parse</span>;</code></pre>
1419
+ </td>
1420
+ </tr>
1421
+ <tr class="code">
1422
+ <td class="docs">
1423
+ <p>Provides Sinatra and Express like routing capabilities.</p>
1424
+
1425
+ <h2>Examples</h2>
1426
+
1427
+ <pre><code>connect.router(function(app){
1428
+ app.get('/user/:id', function(req, res, params){
1429
+ // populates params.id
1430
+ });
1431
+ })</code></pre>
1432
+
1433
+ <h2></h2>
1434
+
1435
+ <ul><li><p><strong>param</strong>: <em>Function</em> fn</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1436
+ </td>
1437
+ <td class="code">
1438
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">router</span>(<span class="variable">fn</span>){
1439
+ <span class="keyword">var</span> <span class="variable">routes</span>;
1440
+
1441
+ <span class="keyword">if</span> (<span class="variable">fn</span>) {
1442
+ <span class="variable">routes</span> = {};
1443
+ <span class="variable">fn</span>.<span class="variable">call</span>(<span class="this">this</span>, {
1444
+ <span class="variable">post</span>: <span class="variable">method</span>.<span class="variable">call</span>(<span class="this">this</span>, <span class="string">'post'</span>),
1445
+ <span class="variable">get</span>: <span class="variable">method</span>.<span class="variable">call</span>(<span class="this">this</span>, <span class="string">'get'</span>),
1446
+ <span class="variable">put</span>: <span class="variable">method</span>.<span class="variable">call</span>(<span class="this">this</span>, <span class="string">'put'</span>),
1447
+ <span class="variable">del</span>: <span class="variable">method</span>.<span class="variable">call</span>(<span class="this">this</span>, <span class="string">'del'</span>)
1448
+ });
1449
+ } <span class="keyword">else</span> {
1450
+ <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'router provider requires a callback function'</span>);
1451
+ }
1452
+
1453
+ <span class="keyword">function</span> <span class="variable">method</span>(<span class="variable">name</span>) {
1454
+ <span class="keyword">var</span> <span class="variable">self</span> = <span class="this">this</span>,
1455
+ <span class="variable">localRoutes</span> = <span class="variable">routes</span>[<span class="variable">name</span>] = <span class="variable">routes</span>[<span class="variable">name</span>] || [];
1456
+ <span class="keyword">return</span> <span class="keyword">function</span>(<span class="variable">path</span>, <span class="variable">fn</span>){
1457
+ <span class="keyword">var</span> <span class="variable">keys</span> = [];
1458
+ <span class="variable">path</span> = <span class="variable">path</span> <span class="variable">instanceof</span> <span class="class">RegExp</span>
1459
+ ? <span class="variable">path</span>
1460
+ : <span class="variable">normalizePath</span>(<span class="variable">path</span>, <span class="variable">keys</span>);
1461
+ <span class="variable">localRoutes</span>.<span class="variable">push</span>(<span class="variable">fn</span>, <span class="variable">path</span>, <span class="variable">keys</span>);
1462
+ <span class="keyword">return</span> <span class="variable">self</span>;
1463
+ };
1464
+ }
1465
+
1466
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">router</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>){
1467
+ <span class="keyword">var</span> <span class="variable">route</span>,
1468
+ <span class="variable">self</span> = <span class="this">this</span>;
1469
+ (<span class="keyword">function</span> <span class="variable">pass</span>(<span class="variable">i</span>){
1470
+ <span class="keyword">if</span> (<span class="variable">route</span> = <span class="variable">match</span>(<span class="variable">req</span>, <span class="variable">routes</span>, <span class="variable">i</span>)) {
1471
+ <span class="variable">req</span>.<span class="variable">params</span> = <span class="variable">req</span>.<span class="variable">params</span> || {};
1472
+ <span class="variable">req</span>.<span class="variable">params</span>.<span class="variable">path</span> = <span class="variable">route</span>.<span class="variable">_params</span>;
1473
+ <span class="keyword">try</span> {
1474
+ <span class="variable">route</span>.<span class="variable">call</span>(<span class="variable">self</span>, <span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">route</span>.<span class="variable">_params</span>, <span class="keyword">function</span>(<span class="variable">err</span>){
1475
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
1476
+ <span class="variable">next</span>(<span class="variable">err</span>);
1477
+ } <span class="keyword">else</span> {
1478
+ <span class="variable">pass</span>(++<span class="variable">route</span>.<span class="variable">_index</span>);
1479
+ }
1480
+ });
1481
+ } <span class="keyword">catch</span> (<span class="variable">err</span>) {
1482
+ <span class="variable">next</span>(<span class="variable">err</span>);
1483
+ }
1484
+ } <span class="keyword">else</span> {
1485
+ <span class="variable">next</span>();
1486
+ }
1487
+ })();
1488
+ };
1489
+ }</code></pre>
1490
+ </td>
1491
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/session/memory.js"><a href="#">memory</a></h2></td><td>lib/connect/middleware/session/memory.js</td></tr><tr class="code">
1492
+ <td class="docs">
1493
+ <p>Module dependencies.
1494
+ </p>
1495
+ </td>
1496
+ <td class="code">
1497
+ <pre><code><span class="keyword">var</span> <span class="variable">sys</span> = <span class="variable">require</span>(<span class="string">'sys'</span>),
1498
+ <span class="class">Store</span> = <span class="variable">require</span>(<span class="string">'./store'</span>),
1499
+ <span class="variable">utils</span> = <span class="variable">require</span>(<span class="string">'./../../utils'</span>),
1500
+ <span class="class">Session</span> = <span class="variable">require</span>(<span class="string">'./session'</span>);</code></pre>
1501
+ </td>
1502
+ </tr>
1503
+ <tr class="code">
1504
+ <td class="docs">
1505
+ <p>Initialize MemoryStore with the given options.</p>
1506
+
1507
+ <h2></h2>
1508
+
1509
+ <ul><li><p><strong>param</strong>: <em>Object</em> options</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1510
+ </td>
1511
+ <td class="code">
1512
+ <pre><code><span class="keyword">var</span> <span class="class">MemoryStore</span> = <span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="class">MemoryStore</span>(<span class="variable">options</span>) {
1513
+ <span class="variable">options</span> = <span class="variable">options</span> || {};
1514
+ <span class="class">Store</span>.<span class="variable">call</span>(<span class="this">this</span>, <span class="variable">options</span>);
1515
+ <span class="this">this</span>.<span class="variable">sessions</span> = {};
1516
+
1517
+ <span class="comment">// Default reapInterval to 10 minutes</span>
1518
+ <span class="this">this</span>.<span class="variable">reapInterval</span> = <span class="variable">options</span>.<span class="variable">reapInterval</span> || <span class="number integer">600000</span>;
1519
+
1520
+ <span class="comment">// Reap stale sessions</span>
1521
+ <span class="keyword">if</span> (<span class="this">this</span>.<span class="variable">reapInterval</span> !== -<span class="number integer">1</span>) {
1522
+ <span class="variable">setInterval</span>(<span class="keyword">function</span>(<span class="variable">self</span>){
1523
+ <span class="variable">self</span>.<span class="variable">reap</span>(<span class="variable">self</span>.<span class="variable">maxAge</span>);
1524
+ }, <span class="this">this</span>.<span class="variable">reapInterval</span>, <span class="this">this</span>);
1525
+ }
1526
+ };
1527
+
1528
+ <span class="variable">sys</span>.<span class="variable">inherits</span>(<span class="class">MemoryStore</span>, <span class="class">Store</span>);</code></pre>
1529
+ </td>
1530
+ </tr>
1531
+ <tr class="code">
1532
+ <td class="docs">
1533
+ <p>Attempt to fetch session by the given <code>hash</code>.</p>
1534
+
1535
+ <h2></h2>
1536
+
1537
+ <ul><li><p><strong>param</strong>: <em>String</em> hash</p></li><li><p><strong>param</strong>: <em>Function</em> fn</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1538
+ </td>
1539
+ <td class="code">
1540
+ <pre><code><span class="class">MemoryStore</span>.<span class="variable">prototype</span>.<span class="variable">get</span> = <span class="keyword">function</span>(<span class="variable">hash</span>, <span class="variable">fn</span>){
1541
+ <span class="keyword">if</span> (<span class="variable">hash</span> <span class="keyword">in</span> <span class="this">this</span>.<span class="variable">sessions</span>) {
1542
+ <span class="variable">fn</span>(<span class="keyword">null</span>, <span class="this">this</span>.<span class="variable">sessions</span>[<span class="variable">hash</span>]);
1543
+ } <span class="keyword">else</span> {
1544
+ <span class="variable">fn</span>();
1545
+ }
1546
+ };</code></pre>
1547
+ </td>
1548
+ </tr>
1549
+ <tr class="code">
1550
+ <td class="docs">
1551
+ <p>Commit the given <code>sess</code> object associated with the given <code>hash</code>.</p>
1552
+
1553
+ <h2></h2>
1554
+
1555
+ <ul><li><p><strong>param</strong>: <em>String</em> hash</p></li><li><p><strong>param</strong>: <em>Session</em> sess</p></li><li><p><strong>param</strong>: <em>Function</em> fn</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1556
+ </td>
1557
+ <td class="code">
1558
+ <pre><code><span class="class">MemoryStore</span>.<span class="variable">prototype</span>.<span class="variable">set</span> = <span class="keyword">function</span>(<span class="variable">hash</span>, <span class="variable">sess</span>, <span class="variable">fn</span>){
1559
+ <span class="this">this</span>.<span class="variable">sessions</span>[<span class="variable">hash</span>] = <span class="variable">sess</span>;
1560
+ <span class="variable">fn</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">fn</span>();
1561
+ };</code></pre>
1562
+ </td>
1563
+ </tr>
1564
+ <tr class="code">
1565
+ <td class="docs">
1566
+ <p>Destroy the session associated with the given <code>hash</code>.</p>
1567
+
1568
+ <h2></h2>
1569
+
1570
+ <ul><li><p><strong>param</strong>: <em>String</em> hash</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1571
+ </td>
1572
+ <td class="code">
1573
+ <pre><code><span class="class">MemoryStore</span>.<span class="variable">prototype</span>.<span class="variable">destroy</span> = <span class="keyword">function</span>(<span class="variable">hash</span>, <span class="variable">fn</span>){
1574
+ <span class="keyword">delete</span> <span class="this">this</span>.<span class="variable">sessions</span>[<span class="variable">hash</span>];
1575
+ <span class="variable">fn</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">fn</span>();
1576
+ };</code></pre>
1577
+ </td>
1578
+ </tr>
1579
+ <tr class="code">
1580
+ <td class="docs">
1581
+ <p>Invoke the given callback <code>fn</code> with all active sessions.</p>
1582
+
1583
+ <h2></h2>
1584
+
1585
+ <ul><li><p><strong>param</strong>: <em>Function</em> fn</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1586
+ </td>
1587
+ <td class="code">
1588
+ <pre><code><span class="class">MemoryStore</span>.<span class="variable">prototype</span>.<span class="variable">all</span> = <span class="keyword">function</span>(<span class="variable">fn</span>){
1589
+ <span class="keyword">var</span> <span class="variable">arr</span> = [],
1590
+ <span class="variable">keys</span> = <span class="class">Object</span>.<span class="variable">keys</span>(<span class="this">this</span>.<span class="variable">sessions</span>);
1591
+ <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">keys</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
1592
+ <span class="variable">arr</span>.<span class="variable">push</span>(<span class="this">this</span>.<span class="variable">sessions</span>[<span class="variable">keys</span>[<span class="variable">i</span>]]);
1593
+ }
1594
+ <span class="variable">fn</span>(<span class="keyword">null</span>, <span class="variable">arr</span>);
1595
+ };</code></pre>
1596
+ </td>
1597
+ </tr>
1598
+ <tr class="code">
1599
+ <td class="docs">
1600
+ <p>Clear all sessions.</p>
1601
+
1602
+ <h2></h2>
1603
+
1604
+ <ul><li><p><strong>param</strong>: <em>Function</em> fn</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1605
+ </td>
1606
+ <td class="code">
1607
+ <pre><code><span class="class">MemoryStore</span>.<span class="variable">prototype</span>.<span class="variable">clear</span> = <span class="keyword">function</span>(<span class="variable">fn</span>){
1608
+ <span class="this">this</span>.<span class="variable">sessions</span> = {};
1609
+ <span class="variable">fn</span> &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">fn</span>();
1610
+ };</code></pre>
1611
+ </td>
1612
+ </tr>
1613
+ <tr class="code">
1614
+ <td class="docs">
1615
+ <p>Fetch number of sessions.</p>
1616
+
1617
+ <h2></h2>
1618
+
1619
+ <ul><li><p><strong>param</strong>: <em>Function</em> fn</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1620
+ </td>
1621
+ <td class="code">
1622
+ <pre><code><span class="class">MemoryStore</span>.<span class="variable">prototype</span>.<span class="variable">length</span> = <span class="keyword">function</span>(<span class="variable">fn</span>){
1623
+ <span class="variable">fn</span>(<span class="keyword">null</span>, <span class="class">Object</span>.<span class="variable">keys</span>(<span class="this">this</span>.<span class="variable">sessions</span>).<span class="variable">length</span>);
1624
+ };
1625
+ </code></pre>
1626
+ </td>
1627
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/session/session.js"><a href="#">session</a></h2></td><td>lib/connect/middleware/session/session.js</td></tr><tr class="code">
1628
+ <td class="docs">
1629
+ <p>Module dependencies.
1630
+ </p>
1631
+ </td>
1632
+ <td class="code">
1633
+ <pre><code><span class="keyword">var</span> <span class="variable">utils</span> = <span class="variable">require</span>(<span class="string">'./../../utils'</span>);</code></pre>
1634
+ </td>
1635
+ </tr>
1636
+ <tr class="code">
1637
+ <td class="docs">
1638
+ <p>Update lastAccess timestamp.</p>
1639
+
1640
+ <ul><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1641
+ </td>
1642
+ <td class="code">
1643
+ <pre><code><span class="class">Session</span>.<span class="variable">prototype</span>.<span class="variable">touch</span> = <span class="keyword">function</span>(){
1644
+ <span class="this">this</span>.<span class="variable">lastAccess</span> = +<span class="keyword">new</span> <span class="class">Date</span>;
1645
+ };</code></pre>
1646
+ </td>
1647
+ </tr>
1648
+ <tr class="code">
1649
+ <td class="docs">
1650
+ <p>Destroy <code>this</code> session.</p>
1651
+
1652
+ <h2></h2>
1653
+
1654
+ <ul><li><p><strong>param</strong>: <em>Function</em> fn</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1655
+ </td>
1656
+ <td class="code">
1657
+ <pre><code><span class="class">Session</span>.<span class="variable">prototype</span>.<span class="variable">destroy</span> = <span class="keyword">function</span>(<span class="variable">fn</span>){
1658
+ <span class="keyword">delete</span> <span class="this">this</span>.<span class="variable">req</span>.<span class="variable">session</span>;
1659
+ <span class="this">this</span>.<span class="variable">req</span>.<span class="variable">sessionStore</span>.<span class="variable">destroy</span>(<span class="this">this</span>.<span class="variable">req</span>.<span class="variable">sessionHash</span>, <span class="variable">fn</span>);
1660
+ };</code></pre>
1661
+ </td>
1662
+ </tr>
1663
+ <tr class="code">
1664
+ <td class="docs">
1665
+ <p>Regenerate this request's session.</p>
1666
+
1667
+ <h2></h2>
1668
+
1669
+ <ul><li><p><strong>param</strong>: <em>Function</em> fn</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1670
+ </td>
1671
+ <td class="code">
1672
+ <pre><code><span class="class">Session</span>.<span class="variable">prototype</span>.<span class="variable">regenerate</span> = <span class="keyword">function</span>(<span class="variable">fn</span>){
1673
+ <span class="this">this</span>.<span class="variable">req</span>.<span class="variable">sessionStore</span>.<span class="variable">regenerate</span>(<span class="this">this</span>.<span class="variable">req</span>, <span class="variable">fn</span>);
1674
+ };
1675
+
1676
+ </code></pre>
1677
+ </td>
1678
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/session/store.js"><a href="#">store</a></h2></td><td>lib/connect/middleware/session/store.js</td></tr><tr class="code">
1679
+ <td class="docs">
1680
+ <p>Module dependencies.
1681
+ </p>
1682
+ </td>
1683
+ <td class="code">
1684
+ <pre><code><span class="keyword">var</span> <span class="class">Session</span> = <span class="variable">require</span>(<span class="string">'./session'</span>),
1685
+ <span class="variable">utils</span> = <span class="variable">require</span>(<span class="string">'./../../utils'</span>);</code></pre>
1686
+ </td>
1687
+ </tr>
1688
+ <tr class="code">
1689
+ <td class="docs">
1690
+ <p>Destroy session associated with the given <code>hash</code>
1691
+ by passing <code>null</code> to <code>Store#get()</code>.</p>
1692
+
1693
+ <h2></h2>
1694
+
1695
+ <ul><li><p><strong>param</strong>: <em>String</em> hash</p></li><li><p><strong>param</strong>: <em>Function</em> fn</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1696
+ </td>
1697
+ <td class="code">
1698
+ <pre><code><span class="class">Store</span>.<span class="variable">prototype</span>.<span class="variable">destroy</span> = <span class="keyword">function</span>(<span class="variable">hash</span>, <span class="variable">fn</span>){
1699
+ <span class="this">this</span>.<span class="variable">set</span>(<span class="variable">hash</span>, <span class="keyword">null</span>, <span class="variable">fn</span>);
1700
+ };</code></pre>
1701
+ </td>
1702
+ </tr>
1703
+ <tr class="code">
1704
+ <td class="docs">
1705
+ <p>Re-generate the given requests's session.</p>
1706
+
1707
+ <h2></h2>
1708
+
1709
+ <ul><li><p><strong>param</strong>: <em>IncomingRequest</em> req</p></li><li><p><strong>return</strong>: <em>Function</em> fn</p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1710
+ </td>
1711
+ <td class="code">
1712
+ <pre><code><span class="class">Store</span>.<span class="variable">prototype</span>.<span class="variable">regenerate</span> = <span class="keyword">function</span>(<span class="variable">req</span>, <span class="variable">fn</span>){
1713
+ <span class="keyword">var</span> <span class="variable">self</span> = <span class="this">this</span>;
1714
+ <span class="this">this</span>.<span class="variable">destroy</span>(<span class="variable">req</span>.<span class="variable">sessionHash</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">destroyed</span>){
1715
+ <span class="variable">req</span>.<span class="variable">session</span> = <span class="keyword">new</span> <span class="class">Session</span>(<span class="variable">req</span>, <span class="variable">utils</span>.<span class="variable">uid</span>());
1716
+ <span class="variable">req</span>.<span class="variable">sessionHash</span> = <span class="variable">self</span>.<span class="variable">hash</span>(<span class="variable">req</span>);
1717
+ <span class="variable">fn</span>(<span class="variable">err</span>, <span class="variable">destroyed</span>);
1718
+ });
1719
+ };</code></pre>
1720
+ </td>
1721
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/session.js"><a href="#">session</a></h2></td><td>lib/connect/middleware/session.js</td></tr><tr class="code">
1722
+ <td class="docs">
1723
+ <p>Module dependencies.
1724
+ </p>
1725
+ </td>
1726
+ <td class="code">
1727
+ <pre><code><span class="keyword">var</span> <span class="class">MemoryStore</span> = <span class="variable">require</span>(<span class="string">'./session/memory'</span>),
1728
+ <span class="class">Session</span> = <span class="variable">require</span>(<span class="string">'./session/session'</span>),
1729
+ <span class="variable">utils</span> = <span class="variable">require</span>(<span class="string">'./../utils'</span>);</code></pre>
1730
+ </td>
1731
+ </tr>
1732
+ <tr class="code">
1733
+ <td class="docs">
1734
+ <p>Setup session store with the given <code>options</code>.</p>
1735
+
1736
+ <h2>Options</h2>
1737
+
1738
+ <ul><li><code>store</code> Session store instance</li><li><code>fingerprint</code> Custom fingerprint hashing function</li></ul>
1739
+
1740
+ <h2></h2>
1741
+
1742
+ <ul><li><p><strong>param</strong>: <em>Object</em> options</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1743
+ </td>
1744
+ <td class="code">
1745
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">session</span>(<span class="variable">options</span>){
1746
+ <span class="variable">options</span> = <span class="variable">options</span> || {};
1747
+ <span class="keyword">var</span> <span class="variable">key</span> = <span class="string">'connect.sid'</span>;
1748
+
1749
+ <span class="comment">// Default memory store</span>
1750
+ <span class="variable">store</span> = <span class="variable">options</span>.<span class="variable">store</span> || <span class="keyword">new</span> <span class="class">MemoryStore</span>;
1751
+
1752
+ <span class="comment">// Default fingerprint hashing function</span>
1753
+ <span class="keyword">var</span> <span class="variable">hash</span> = <span class="variable">store</span>.<span class="variable">hash</span> = <span class="variable">options</span>.<span class="variable">fingerprint</span> || <span class="keyword">function</span>(<span class="variable">req</span>){
1754
+ <span class="keyword">return</span> <span class="variable">utils</span>.<span class="variable">md5</span>(<span class="variable">req</span>.<span class="variable">session</span>.<span class="variable">id</span>
1755
+ + <span class="variable">req</span>.<span class="variable">socket</span>.<span class="variable">remoteAddress</span>
1756
+ + (<span class="variable">req</span>.<span class="variable">headers</span>[<span class="string">'user-agent'</span>] || <span class="string">''</span>));
1757
+ };
1758
+
1759
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">session</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>){
1760
+ <span class="comment">// Expose store</span>
1761
+ <span class="variable">req</span>.<span class="variable">sessionStore</span> = <span class="variable">store</span>;
1762
+
1763
+ <span class="keyword">if</span> (<span class="variable">req</span>.<span class="variable">cookies</span>) {
1764
+ <span class="comment">// Commit session</span>
1765
+ <span class="keyword">var</span> <span class="variable">writeHead</span> = <span class="variable">res</span>.<span class="variable">writeHead</span>;
1766
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="keyword">function</span>(<span class="variable">status</span>, <span class="variable">headers</span>){
1767
+ <span class="variable">headers</span> = <span class="variable">headers</span> || {};
1768
+ <span class="variable">res</span>.<span class="variable">writeHead</span> = <span class="variable">writeHead</span>;
1769
+ <span class="variable">store</span>.<span class="variable">set</span>(<span class="variable">req</span>.<span class="variable">sessionHash</span>, <span class="variable">req</span>.<span class="variable">session</span>);
1770
+ <span class="variable">store</span>.<span class="variable">cookie</span>.<span class="variable">expires</span> = <span class="keyword">new</span> <span class="class">Date</span>(+<span class="keyword">new</span> <span class="class">Date</span>() + <span class="variable">store</span>.<span class="variable">maxAge</span>);
1771
+ <span class="variable">headers</span>[<span class="string">'Set-Cookie'</span>] = <span class="variable">utils</span>.<span class="variable">serializeCookie</span>(<span class="variable">key</span>, <span class="variable">req</span>.<span class="variable">session</span>.<span class="variable">id</span>, <span class="variable">store</span>.<span class="variable">cookie</span>);
1772
+ <span class="keyword">return</span> <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="variable">status</span>, <span class="variable">headers</span>);
1773
+ };
1774
+
1775
+ <span class="comment">// Generates the new session</span>
1776
+ <span class="keyword">function</span> <span class="variable">generate</span>() {
1777
+ <span class="variable">req</span>.<span class="variable">session</span> = <span class="keyword">new</span> <span class="class">Session</span>(<span class="variable">req</span>, <span class="variable">utils</span>.<span class="variable">uid</span>());
1778
+ <span class="variable">req</span>.<span class="variable">sessionHash</span> = <span class="variable">hash</span>(<span class="variable">req</span>);
1779
+ <span class="variable">next</span>();
1780
+ }
1781
+
1782
+ <span class="comment">// We have an sid</span>
1783
+ <span class="keyword">if</span> (<span class="variable">req</span>.<span class="variable">cookies</span>[<span class="variable">key</span>]) {
1784
+ <span class="variable">req</span>.<span class="variable">session</span> = <span class="keyword">new</span> <span class="class">Session</span>(<span class="variable">req</span>, <span class="variable">req</span>.<span class="variable">cookies</span>[<span class="variable">key</span>]);
1785
+ <span class="variable">req</span>.<span class="variable">sessionHash</span> = <span class="variable">hash</span>(<span class="variable">req</span>);
1786
+ <span class="comment">// See if the hash is valid</span>
1787
+ <span class="variable">store</span>.<span class="variable">get</span>(<span class="variable">req</span>.<span class="variable">sessionHash</span>, <span class="keyword">function</span>(<span class="variable">err</span>, <span class="variable">sess</span>){
1788
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
1789
+ <span class="variable">next</span>(<span class="variable">err</span>);
1790
+ } <span class="keyword">else</span> <span class="keyword">if</span> (<span class="variable">sess</span>) {
1791
+ <span class="comment">// Valid; apply session data and update lastAccess</span>
1792
+ <span class="variable">req</span>.<span class="variable">session</span> = <span class="keyword">new</span> <span class="class">Session</span>(<span class="variable">req</span>, <span class="variable">sess</span>);
1793
+ <span class="variable">req</span>.<span class="variable">session</span>.<span class="variable">touch</span>();
1794
+ <span class="variable">next</span>();
1795
+ } <span class="keyword">else</span> {
1796
+ <span class="comment">// Invalid; generate</span>
1797
+ <span class="variable">generate</span>();
1798
+ }
1799
+ });
1800
+ } <span class="keyword">else</span> {
1801
+ <span class="comment">// No sid; generate</span>
1802
+ <span class="variable">generate</span>();
1803
+ }
1804
+ } <span class="keyword">else</span> {
1805
+ <span class="variable">next</span>();
1806
+ }
1807
+ }
1808
+ };</code></pre>
1809
+ </td>
1810
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/staticProvider.js"><a href="#">staticProvider</a></h2></td><td>lib/connect/middleware/staticProvider.js</td></tr><tr class="code">
1811
+ <td class="docs">
1812
+ <p>Module dependencies.
1813
+ </p>
1814
+ </td>
1815
+ <td class="code">
1816
+ <pre><code><span class="keyword">var</span> <span class="variable">fs</span> = <span class="variable">require</span>(<span class="string">'fs'</span>),
1817
+ <span class="class">Url</span> = <span class="variable">require</span>(<span class="string">'url'</span>),
1818
+ <span class="class">Buffer</span> = <span class="variable">require</span>(<span class="string">'buffer'</span>).<span class="class">Buffer</span>,
1819
+ <span class="class">Path</span> = <span class="variable">require</span>(<span class="string">'path'</span>),
1820
+ <span class="variable">queryString</span> = <span class="variable">require</span>(<span class="string">'querystring'</span>),
1821
+ <span class="variable">utils</span> = <span class="variable">require</span>(<span class="string">'./../utils'</span>);</code></pre>
1822
+ </td>
1823
+ </tr>
1824
+ <tr class="code">
1825
+ <td class="docs">
1826
+ <p>Browser cache lifetime of one hour.</p>
1827
+
1828
+ <ul><li><p><strong>type</strong>: <em>Number</em></p></li></ul>
1829
+ </td>
1830
+ <td class="code">
1831
+ <pre><code><span class="keyword">var</span> <span class="variable">lifetime</span> = <span class="number integer">1000</span> * <span class="number integer">60</span> * <span class="number integer">60</span>;</code></pre>
1832
+ </td>
1833
+ </tr>
1834
+ <tr class="code">
1835
+ <td class="docs">
1836
+ <p>Static file server.</p>
1837
+
1838
+ <h2>Options</h2>
1839
+
1840
+ <ul><li><code>root</code> Root path from which to serve static files.</li></ul>
1841
+
1842
+ <h2></h2>
1843
+
1844
+ <ul><li><p><strong>param</strong>: <em>String</em> root</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1845
+ </td>
1846
+ <td class="code">
1847
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">staticProvider</span>(<span class="variable">root</span>){
1848
+ <span class="variable">root</span> = <span class="variable">process</span>.<span class="variable">connectEnv</span>.<span class="variable">staticRoot</span> || <span class="variable">root</span> || <span class="variable">process</span>.<span class="variable">cwd</span>();
1849
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">staticProvider</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>) {
1850
+ <span class="keyword">if</span> (<span class="variable">req</span>.<span class="variable">method</span> !== &<span class="variable">quot</span>;<span class="class">GET</span>&<span class="variable">quot</span>;) {
1851
+ <span class="variable">next</span>();
1852
+ <span class="keyword">return</span>;
1853
+ }
1854
+ <span class="keyword">var</span> <span class="variable">url</span> = <span class="class">Url</span>.<span class="variable">parse</span>(<span class="variable">req</span>.<span class="variable">url</span>);
1855
+
1856
+ <span class="keyword">var</span> <span class="variable">pathname</span> = <span class="variable">url</span>.<span class="variable">pathname</span>.<span class="variable">replace</span>(<span class="regexp">/\.\.+/g</span>, <span class="string">'.'</span>),
1857
+ <span class="variable">filename</span> = <span class="class">Path</span>.<span class="variable">join</span>(<span class="variable">root</span>, <span class="variable">queryString</span>.<span class="variable">unescape</span>(<span class="variable">pathname</span>));
1858
+
1859
+ <span class="keyword">if</span> (<span class="variable">filename</span>[<span class="variable">filename</span>.<span class="variable">length</span> - <span class="number integer">1</span>] === &<span class="variable">quot</span>;/&<span class="variable">quot</span>;) {
1860
+ <span class="variable">filename</span> += &<span class="variable">quot</span>;<span class="variable">index</span>.<span class="variable">html</span>&<span class="variable">quot</span>;;
1861
+ }
1862
+
1863
+ <span class="comment">// Buffer any events that fire while waiting on the stat.</span>
1864
+ <span class="keyword">var</span> <span class="variable">events</span> = [];
1865
+ <span class="keyword">function</span> <span class="variable">onData</span>() {
1866
+ <span class="variable">events</span>.<span class="variable">push</span>([&<span class="variable">quot</span>;<span class="variable">data</span>&<span class="variable">quot</span>;].<span class="variable">concat</span>(<span class="variable">toArray</span>(<span class="variable">arguments</span>)));
1867
+ }
1868
+ <span class="keyword">function</span> <span class="variable">onEnd</span>() {
1869
+ <span class="variable">events</span>.<span class="variable">push</span>([&<span class="variable">quot</span>;<span class="variable">end</span>&<span class="variable">quot</span>;].<span class="variable">concat</span>(<span class="variable">toArray</span>(<span class="variable">arguments</span>)));
1870
+ }
1871
+ <span class="variable">req</span>.<span class="variable">addListener</span>(&<span class="variable">quot</span>;<span class="variable">data</span>&<span class="variable">quot</span>;, <span class="variable">onData</span>);
1872
+ <span class="variable">req</span>.<span class="variable">addListener</span>(&<span class="variable">quot</span>;<span class="variable">end</span>&<span class="variable">quot</span>;, <span class="variable">onEnd</span>);
1873
+
1874
+ <span class="variable">fs</span>.<span class="variable">stat</span>(<span class="variable">filename</span>, <span class="keyword">function</span> (<span class="variable">err</span>, <span class="variable">stat</span>) {
1875
+
1876
+ <span class="comment">// Stop buffering events</span>
1877
+ <span class="variable">req</span>.<span class="variable">removeListener</span>(&<span class="variable">quot</span>;<span class="variable">data</span>&<span class="variable">quot</span>;, <span class="variable">onData</span>);
1878
+ <span class="variable">req</span>.<span class="variable">removeListener</span>(&<span class="variable">quot</span>;<span class="variable">end</span>&<span class="variable">quot</span>;, <span class="variable">onEnd</span>);
1879
+
1880
+ <span class="comment">// Fall through for missing files, thow error for other problems</span>
1881
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
1882
+ <span class="keyword">if</span> (<span class="variable">err</span>.<span class="variable">errno</span> === <span class="variable">process</span>.<span class="class">ENOENT</span>) {
1883
+ <span class="variable">next</span>();
1884
+ <span class="comment">// Refire the buffered events</span>
1885
+ <span class="keyword">for</span> (<span class="keyword">var</span> <span class="variable">i</span> = <span class="number integer">0</span>, <span class="variable">len</span> = <span class="variable">events</span>.<span class="variable">length</span>; <span class="variable">i</span> &<span class="variable">lt</span>; <span class="variable">len</span>; ++<span class="variable">i</span>) {
1886
+ <span class="variable">req</span>.<span class="variable">emit</span>.<span class="variable">apply</span>(<span class="variable">req</span>, <span class="variable">events</span>[<span class="variable">i</span>]);
1887
+ }
1888
+ <span class="keyword">return</span>;
1889
+ }
1890
+ <span class="variable">next</span>(<span class="variable">err</span>);
1891
+ <span class="keyword">return</span>;
1892
+ }
1893
+
1894
+ <span class="comment">// Serve the file directly using buffers</span>
1895
+ <span class="keyword">function</span> <span class="variable">onRead</span>(<span class="variable">err</span>, <span class="variable">data</span>) {
1896
+ <span class="keyword">if</span> (<span class="variable">err</span>) {
1897
+ <span class="variable">next</span>(<span class="variable">err</span>);
1898
+ <span class="keyword">return</span>;
1899
+ }
1900
+
1901
+ <span class="comment">// For older versions of node convert the string to a buffer.</span>
1902
+ <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable">data</span> === <span class="string">'string'</span>) {
1903
+ <span class="keyword">var</span> <span class="variable">b</span> = <span class="keyword">new</span> <span class="class">Buffer</span>(<span class="variable">data</span>.<span class="variable">length</span>);
1904
+ <span class="variable">b</span>.<span class="variable">write</span>(<span class="variable">data</span>, &<span class="variable">quot</span>;<span class="variable">binary</span>&<span class="variable">quot</span>;);
1905
+ <span class="variable">data</span> = <span class="variable">b</span>;
1906
+ }
1907
+
1908
+ <span class="comment">// Zero length buffers act funny, use a string</span>
1909
+ <span class="keyword">if</span> (<span class="variable">data</span>.<span class="variable">length</span> === <span class="number integer">0</span>) {
1910
+ <span class="variable">data</span> = &<span class="variable">quot</span>;&<span class="variable">quot</span>;;
1911
+ }
1912
+
1913
+ <span class="variable">res</span>.<span class="variable">writeHead</span>(<span class="number integer">200</span>, {
1914
+ &<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Type</span>&<span class="variable">quot</span>;: <span class="variable">utils</span>.<span class="variable">mime</span>.<span class="variable">type</span>(<span class="variable">filename</span>),
1915
+ &<span class="variable">quot</span>;<span class="class">Content</span>-<span class="class">Length</span>&<span class="variable">quot</span>;: <span class="variable">data</span>.<span class="variable">length</span>,
1916
+ &<span class="variable">quot</span>;<span class="class">Last</span>-<span class="class">Modified</span>&<span class="variable">quot</span>;: <span class="variable">stat</span>.<span class="variable">mtime</span>.<span class="variable">toUTCString</span>(),
1917
+ <span class="comment">// Cache in browser for 1 year</span>
1918
+ &<span class="variable">quot</span>;<span class="class">Cache</span>-<span class="class">Control</span>&<span class="variable">quot</span>;: &<span class="variable">quot</span>;<span class="variable">public</span> <span class="variable">max</span>-<span class="variable">age</span>=&<span class="variable">quot</span>; + <span class="number integer">31536000</span>
1919
+ });
1920
+ <span class="variable">res</span>.<span class="variable">end</span>(<span class="variable">data</span>);
1921
+ }
1922
+
1923
+ <span class="comment">// Node before 0.1.95 doesn't do buffers for fs.readFile</span>
1924
+ <span class="keyword">if</span> (<span class="variable">process</span>.<span class="variable">version</span> &<span class="variable">lt</span>; &<span class="variable">quot</span>;<span class="number float">0.1</span>.<span class="number integer">95</span>&<span class="variable">quot</span>; &<span class="variable">amp</span>;&<span class="variable">amp</span>; <span class="variable">process</span>.<span class="variable">version</span> &<span class="variable">gt</span>; &<span class="variable">quot</span>;<span class="number float">0.1</span>.<span class="number integer">100</span>&<span class="variable">quot</span>;) {
1925
+ <span class="comment">// sys.debug(&quot;Warning: Old node version has slower static file loading&quot;);</span>
1926
+ <span class="variable">fs</span>.<span class="variable">readFile</span>(<span class="variable">filename</span>, &<span class="variable">quot</span>;<span class="variable">binary</span>&<span class="variable">quot</span>;, <span class="variable">onRead</span>);
1927
+ } <span class="keyword">else</span> {
1928
+ <span class="variable">fs</span>.<span class="variable">readFile</span>(<span class="variable">filename</span>, <span class="variable">onRead</span>);
1929
+ }
1930
+ });
1931
+ };
1932
+
1933
+ };</code></pre>
1934
+ </td>
1935
+ </tr><tr class="filename"><td><h2 id="lib/connect/middleware/vhost.js"><a href="#">vhost</a></h2></td><td>lib/connect/middleware/vhost.js</td></tr><tr class="code">
1936
+ <td class="docs">
1937
+ <p>Setup vhost for the given <code>hostname</code> and <code>server</code>.</p>
1938
+
1939
+ <h2>Examples</h2>
1940
+
1941
+ <pre><code>connect.createServer(
1942
+ connect.vhost('foo.com',
1943
+ connect.createServer(...middleware...)
1944
+ ),
1945
+ connect.vhost('bar.com',
1946
+ connect.createServer(...middleware...)
1947
+ )
1948
+ );</code></pre>
1949
+
1950
+ <h2></h2>
1951
+
1952
+ <ul><li><p><strong>param</strong>: <em>String</em> hostname</p></li><li><p><strong>param</strong>: <em>Server</em> server</p></li><li><p><strong>return</strong>: <em>Function</em> </p></li><li><p><strong>api</strong>: <em>public</em></p></li></ul>
1953
+ </td>
1954
+ <td class="code">
1955
+ <pre><code><span class="variable">module</span>.<span class="variable">exports</span> = <span class="keyword">function</span> <span class="variable">vhost</span>(<span class="variable">hostname</span>, <span class="variable">server</span>){
1956
+ <span class="keyword">if</span> (!<span class="variable">hostname</span>) {
1957
+ <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'vhost hostname required'</span>);
1958
+ }
1959
+ <span class="keyword">if</span> (!<span class="variable">server</span>) {
1960
+ <span class="keyword">throw</span> <span class="keyword">new</span> <span class="class">Error</span>(<span class="string">'vhost server required'</span>);
1961
+ }
1962
+ <span class="keyword">return</span> <span class="keyword">function</span> <span class="variable">vhost</span>(<span class="variable">req</span>, <span class="variable">res</span>, <span class="variable">next</span>){
1963
+ <span class="keyword">var</span> <span class="variable">host</span> = <span class="variable">req</span>.<span class="variable">headers</span>.<span class="variable">host</span>.<span class="variable">split</span>(<span class="string">':'</span>)[<span class="number integer">0</span>];
1964
+ <span class="keyword">if</span> (<span class="variable">host</span> === <span class="variable">hostname</span>) {
1965
+ <span class="variable">server</span>.<span class="variable">handle</span>(<span class="variable">req</span>, <span class="variable">res</span>);
1966
+ } <span class="keyword">else</span> {
1967
+ <span class="variable">next</span>();
1968
+ }
1969
+ };
1970
+ };</code></pre>
1971
+ </td>
1972
+ </tr> </body>
1973
+ </html></tbody></table>