Document a bunch of stuff.

This commit is contained in:
Starbeamrainbowlabs 2019-04-27 15:27:09 +01:00
parent 5d6392fe3d
commit 1e56527f44
Signed by: sbrl
GPG Key ID: 1BE5172E637709C2
7 changed files with 5861 additions and 67 deletions

View File

@ -6,14 +6,13 @@ import { pathspec_to_regex } from '../Shared/Pathspec.mjs';
/**
* Client-side request router.
* @extends EventEmitter
* You should use this in a browser. If you're not in a browser, you probably want ServerRouter instead.
* @extends EventEmitter
* @param {object} options The options object to use when creating the router.
* @property {Boolean} verbose Whether to be verbose and log debugging information to the console.
* @property {Boolean} listen_pushstate Whether to listen to the browser's `pushstate` event and automatically navigate on recieving it.
*/
class ClientRouter extends EventEmitter {
/**
* Creates a new client-side request router.
* You should use this in a browser. If you're not in a browser, you probably want ServerRouter instead.
* @param {object} options The options object to use when creating the router.
*/
constructor(options) {
super();

View File

@ -0,0 +1,33 @@
"use strict";
import cookie from 'cookie';
/**
* Holds request environment and state variables.
*/
class RequestEnvironment {
constructor(request) {
/**
* Whether the user is logged in or not.
* @type {Boolean}
*/
this.logged_in = false;
/**
* The user's name. Guaranteed to be specified - if only as "anonymous".
* @type {String}
*/
this.username = "anonymous";
/**
* The parsed cookie object
* @type {Object}
*/
this.cookie = cookie.parse(request.headers["cookie"] || "");
/**
* The parsed post data as an object, if applicable.
* @type {Object|null}
*/
this.post_data = null;
}
}
export default RequestEnvironment;

View File

@ -7,6 +7,7 @@ import { pathspec_to_regex } from '../Shared/Pathspec.mjs';
* A standalone HTTP router that's based on the principle of middleware.
* Based on rill (see the npm package bearing the name), but stripped down and
* simplified.
* @param {Boolean} verbose Whether to be verbose and log a bunch of things to the console. Useful for debugging.
*/
class Router
{
@ -28,19 +29,48 @@ class Router
}
}
/** Shortcut function for attaching an action to any request method. Full function: on */
/**
* Shortcut function for attaching an action to any request method.
* Full function: on
* @param {string|RegExp} pathspec The pathspec that the route should match against.
* @param {Function} action The function to execute when this route is matches.gets passed 2 parameters: context (or type RequestContext) and next (a function). context contains the request / response objects, and next() should be called if the action is middleware.
*/
any(pathspec, action) { this.on("*", pathspec, action); }
/** Shortcut function for attaching an action to head requests. Full function: on */
/**
* Shortcut function for attaching an action to head requests. Full function: on
* @param {string|RegExp} pathspec The pathspec that the route should match against.
* @param {Fuction} action The function to execute.
*/
head(pathspec, action) { this.on(["head"], pathspec, action); }
/** Shortcut function for attaching an action to get requests. Full function: on */
/**
* Shortcut function for attaching an action to get requests. Full function: on
* @param {string|RegExp} pathspec The pathspec that the route should match against.
* @param {Fuction} action The function to execute.
*/
get(pathspec, action) { this.on(["get"], pathspec, action); }
/** Shortcut function for attaching an action to post requests. Full function: on */
/**
* Shortcut function for attaching an action to post requests. Full function: on
* @param {string|RegExp} pathspec The pathspec that the route should match against.
* @param {Fuction} action The function to execute.
*/
post(pathspec, action) { this.on(["post"], pathspec, action); }
/** Shortcut function for attaching an action to put requests. Full function: on */
/**
* Shortcut function for attaching an action to put requests. Full function: on
* @param {string|RegExp} pathspec The pathspec that the route should match against.
* @param {Fuction} action The function to execute.
*/
put(pathspec, action) { this.on(["put"], pathspec, action); }
/** Shortcut function for attaching an action to delete requests. Full function: on */
/**
* Shortcut function for attaching an action to delete requests. Full function: on
* @param {string|RegExp} pathspec The pathspec that the route should match against.
* @param {Fuction} action The function to execute.
*/
delete(pathspec, action) { this.on(["delete"], pathspec, action); }
/** Shortcut function for attaching an action to options requests. Full function: on */
/**
* Shortcut function for attaching an action to options requests. Full function: on
* @param {string|RegExp} pathspec The pathspec that the route should match against.
* @param {Fuction} action The function to execute.
*/
options(pathspec, action) { this.on(["options"], pathspec, action); }
/**
@ -73,6 +103,11 @@ class Router
});
}
/**
* Adds a route that matches against every request.
* Usually useful for middleware (e.g. error handlers, request loggers, authentication handlers, etc.).
* @param {Function} action The function to execute.
*/
on_all(action) {
this.actions.push(action);
}
@ -113,6 +148,8 @@ class Router
* item of middleware.
* It achieves this via a combination of a generator, anonymous function
* scope abuse, being recursive, and magic.
* You shouldn't need to call this directly.
* @private
* @param {Generator} iterator The generator that emits the middleware.
* @param {Object} context The context of the request.
* @return {Function} A magic next function.

View File

@ -1,11 +1,9 @@
"use strict";
// core
import url from 'url';
// npm
import cookie from 'cookie';
// files
import Sender from './Sender.mjs';
import RequestEnvironment from './RequestEnvironment.mjs';
/**
* Contains context information about a single request / response pair.
@ -45,28 +43,7 @@ class RouterContext {
* go in here.
* @type {Object}
*/
this.env = {
/**
* Whether the user is logged in or not.
* @type {Boolean}
*/
logged_in: false,
/**
* The user's name. Guaranteed to be specified - if only as "anonymous".
* @type {String}
*/
username: "anonymous",
/**
* The parsed cookie object
* @type {Object}
*/
cookie: cookie.parse(this.request.headers["cookie"] || ""),
/**
* The parsed post data as an object, if applicable.
* @type {Object|null}
*/
post_data: null
};
this.env = new RequestEnvironment(this.request);
}
}

View File

@ -2,6 +2,10 @@
import { NightInkFile } from 'nightink';
/**
* Helper methods for quickly sending responses to clients.
* @param {http.ServerResponse} response The response object to use when sending requests.
*/
class Sender {
constructor(response) {
this.response = response;

5741
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,30 +1,33 @@
{
"name": "powahroot",
"version": "0.1.0",
"description": "Client and server-side routing micro frameworks",
"main": "index.mjs",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/sbrl/powerroot.git"
},
"keywords": [
"routing",
"micro-framework"
],
"author": "Starbeamrainbowlabs",
"license": "MPL-2.0",
"bugs": {
"url": "https://github.com/sbrl/powerroot/issues"
},
"homepage": "https://github.com/sbrl/powerroot#readme",
"dependencies": {
"nightink": "^0.1.2"
},
"devDependencies": {
"@types/event-emitter-es6": "^1.1.0",
"event-emitter-es6": "^1.1.5"
}
"name": "powahroot",
"version": "0.1.0",
"description": "Client and server-side routing micro frameworks",
"main": "index.mjs",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/sbrl/powerroot.git"
},
"keywords": [
"routing",
"micro-framework"
],
"author": "Starbeamrainbowlabs",
"license": "MPL-2.0",
"bugs": {
"url": "https://github.com/sbrl/powerroot/issues"
},
"homepage": "https://github.com/sbrl/powerroot#readme",
"dependencies": {
"cookie": "^0.3.1",
"nightink": "^0.1.2"
},
"devDependencies": {
"@types/cookie": "^0.3.2",
"@types/event-emitter-es6": "^1.1.0",
"documentation": "^10.1.0",
"event-emitter-es6": "^1.1.5"
}
}