UNPKG

snakey

Version:

An Obeserver-based web microframework for Node.js

51 lines (50 loc) 1.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const rxjs_1 = require("rxjs"); const rxop = require("rxjs/operators"); const http_1 = require("http"); const match_1 = require("./match"); const uri_js_1 = require("uri-js"); const response_1 = require("./response"); var snake_1 = require("./snake"); exports.snake = snake_1.snake; class Context { constructor(request, response, uri, pathMatch = null) { this.request = request; this.response = response; this.pathMatch = pathMatch; this.uri = uri || uri_js_1.parse(request.url); } get method() { return this.request.method; } match(pattern) { if (typeof pattern === 'string') { return new Context(this.request, this.response, this.uri, match_1.matchPathPattern(this.uri.path, pattern)); } else { return new Context(this.request, this.response, this.uri, match_1.matchRegex(this.uri.path, pattern)); } } } exports.Context = Context; /** * Operator that filters HTTP requests by `verb` and `pathPattern`. * @param verb * @param pathPattern */ function bite(verb, pathPattern) { return (obs) => obs.pipe(rxop.filter((v) => v.method === verb), rxop.map((v) => v.match(pathPattern)), rxop.filter((v) => Boolean(v.pathMatch))); } exports.bite = bite; const contextMap = rxop.map(([req, res]) => new Context(req, res)); function applySnakes(snakes, server = new http_1.Server(), observer = new response_1.ResponderObserver) { const obs = rxjs_1.fromEvent(server, 'request'); const streams = snakes.map((s) => obs.pipe(contextMap, s)); return { 'server': server, 'streams': streams, 'subscribers': streams.map((s) => s.subscribe(observer)), }; } exports.applySnakes = applySnakes;