Package Exports
- impress
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (impress) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Impress Application Server for node.js. All decisions are made. Solutions are scaled. Tools are provided and optimized for high load. Ready for applied development and production.
Impress (Impress Application Server, IAS) follows alternative way in several aspects:
- No middleware (avoid such evil as long callback chains);
- Monolithic high cohesion core, must-have things optimized for performance;
- Applied code simplicity, API code high-level abstraction and brevity;
- Support for both Stateful and Stateless approach;
- Extensible plug-ins system for optionally needed features;
- Application can't include Application Server, quite the opposite, Application Server is a container for Applications;
- No I/O is faster even then async I/O, so maximum memory usage and lazy I/O is the choice;
Features
- Can serve multiple applications and sites on multiple domains;
- Serves multiple ports, network interfaces, hosts and protocols;
- Can scale on multiple servers;
- Supports application sandboxing (configuration, db and memory access isolation);
- Utilize multiple CPU cores with instances/workers:
- Cross-process communication (not using built-in node.js cluster library);
- State synchronization mechanism with transactions and subscription;
- No need to write routing manually in code, just create handler files and functions;
- File system watching for cache reloading when file changes on disk;
- Cache server-side executable JavaScript in memory;
- Handlers inheritance override hierarchically;
- API development support (simple way for JSON-based WEB-services development):
- RPC-style API (Stateful, state stored in memory between requests);
- REST-style API (Stateless, each call is separate, no state in memory);
- Implements JSTP (long live and full duplex RPC/MQ over TCP or websockets);
- Multiple handlers for HTTP API (all handlers are optional and
inheritable/overridable):
access.jsreturns access modifiers;request.jsexecuting for all requests (any HTTP verbs and before verb handler); HTTP verbs:get.js,post.js, etc. executes for certain HTTP verb,;end.jsexecutes after HTTP verb handler for all verbs;lazy.jslazy handler executes after the request has already returned to the client-side;error.jsexecuted only if an error occurred while processing the request or in any previous handler; - Supported multiple AJAX API result types: JSON for most APIs (including safe serialization); JSONP (for cross-domain requests); CSV; HTML (aor any extension unknown for IAS) for AJAX server-side HTML rendering; JSTP (for JavaScript Transfer Protocol);
- Server-side simple templating with caching, data structures iterators and personalization based on user groups;
- Serving static files with in-memory preprocessing: gzipping and HTTP
if-modified-sincesupport with HTTP 304 "Not Modified" answer; memory caching and file system watching for cache reloading when files changed on disk; JavaScript minification withuglify-js; SASS compiling styles from.scssto.cssin memory cache; - Built-in sessions support with authentication, groups and anonymous sessions;
- Multiple protocols support:
- JSTP (JavaScript Transfer Protocol) for RPC and MQ; (https://github.com/metarhia/jstp);
- HTTP and HTTPS (node native libraries);
- Implemented SSE (Server-Sent Events) with channels and multi-cast;
- WebSockets support;
- TCP and UDP sockets support;
- Reverse-proxy (routing request to external HTTP server with URL-rewriting);
- Server-wide or application-specific logging, with log buffering (lazy write) and rotation (keep logs N days);
- Connection drivers for database engines: MongoDB, PgSQL, MySQL, Relational schema generator from JSON database schemas;
- File utilities: upload, download, streaming;
- GeoIP support, based on
geoip-litemodule (uses MaxMind database); - Sending emails using
nodemailer; - Built-in simple testing framework;
- Server health monitoring;
- Built-in data structures validation and preprocessing library;
- Process forking:
- Long workers with
clientobject forwarding to separate process; - Task scheduling (interval or certain time);
- Long workers with
- V8 features support:
- Long stack trace with
--stack-trace-limit=1000and stack output minification; - Wrapper for V8 internal functions with
--allow-natives-syntax; - Manual garbage collection with
--nouse-idle-notificationand--expose-gc;
- Long stack trace with
- HTTP basic authentication implemented (optional omitting local requests);
Examples
Example #1
To create GET request handler for URL /api/method.json
File /api/method.json/get.js
(client, callback) => {
callback({ field: 'value' });
}Result: { "field": "value" }
Example #2
To create POST request handler for URL /api/method.json
File /api/method.json/post.js
(client, callback) => {
dbImpress.users
.find({ group: client.fields.group })
.toArray((err, nodes) => callback(nodes));
}Result:
[
{ "login": "Vasia Pupkin", "password": "whoami", "group": "users" },
{ "login": "Marcus Aurelius", "password": "tomyself", "group": "users" }
]Example #3
File access.js works similar to .htaccess and allow one to define access
rules for each folder, by simply putting access.js in it.
If folder does not contain access.js it inherits access rules from its parent
folder, all the way up to the project root.
Example:
{
guests: true, // Allow requests from anonymous (not logged) users
logged: true, // Allow requests from logged users
http: true, // Allow requests using http protocol
https: true, // Allow requests using https protocol
groups: [], // Allow access for user groups listed in array
// or for all if array is empty or no groups specified
intro: true, // Generate introspection for API in this directory
index: false, // Generate directory index
virtual: true // Allow requests to virtual paths, for CMS and REST URLs
}Installation and upgrade
- Install to the current folder:
npm install impress - Install using package.json: add to
dependenciesand runnpm install - Installation scripts for an empty server (from the scratch)
- For CentOS 6
/deploy/centos6x32.shandcentos6x64.sh(tested on CentOS 6.6 32/64bit minimal) - For CentOS 7
/deploy/centos7x64.sh(tested on CentOS 7.0 with systemd 64bit minimal) - For Ubuntu 14 and 15
/deploy/ubuntu.sh(tested on Ubuntu 14.04 64bit minimal) - For Debian 7 and 8
/deploy/debian.sh(tested for Debian 7.5 64bit minimal) - For Fedora 22, 23, 24 and 25 for x64
/deploy/fedora.sh
- For CentOS 6
You can prepare scripts based on examples above and run at a target server shell:
curl http://.../install.sh | sh or wget http://.../install.sh -O - | sh
If Impress Application Server is already installed in directory you want to
install/update it using npm, /applications directory contains applications
and /config contains configuration, Impress will safely detect previous
installation and update libraries and dependencies.
Impress CLI commands
You can use following commands from any directory:
impress path <path>to display or change path to IASimpress startto start IAS serverimpress stopto stop IAS serverimpress restartto restart IAS serverimpress statusto display IAS statusimpress updateto update IAS versionimpress autostart [on|off]to add/remove IAS to autostart on system rebootimpress listto see IAS applications listimpress add [path]to add applicationimpress remove [name]to remove applicationimpress new [name]to create application
Configuration
- Install Impress as described above
- Edit
/config/*.jsto configure Application Server (set IP address in servers.js) - After installation you have
exampleapplication in directory/applications, you can rename it and/or place there other applications - Edit
/applications/example/config/hosts.js, change127.0.0.1tomyapp.com, certainly you need to register and configure domain name myapp.com or just add it intohostsfile in your OS - Place your html to
/applications/example/app/html.templateand copy required files into directories/static/js,/static/css,/static/imagesand start application API development - Run Impress using command
service impress startorsystemctl start impress(if installed as a service) ornode server.js
Contributors
- Timur Shemsedinov (marcusaurelius)
- See github for full contributors list
License
Dual licensed under the MIT or RUMI licenses. Copyright (c) 2012-2017 Metarhia contributors. Project coordinator: <timur.shemsedinov@gmail.com>
RUMI License: Everything that you want, you are already that. // Jalal ad-Din Muhammad Rumi
