snakey
Version:
An Obeserver-based web microframework for Node.js
51 lines (50 loc) • 1.82 kB
JavaScript
;
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;