xmlweb 基于状态机理论设计的 Web 服务器开源项目

我要开发同款
匿名用户2017年06月14日
26阅读
开发技术JavaScript
所属分类Web应用开发、服务器端JavaScript
授权协议MIT

作品详情

xmlweb是一个基于状态机理论设计的web服务器,使用它可以设计出高可读性、高可维护性的web服务应用。你可以使用它作为express或者koa的一个替代。

形式地看,一个状态机包含了状态集、字母表、转移函数、起始状态和接受状态集。在xmlweb中将状态集处理为组件的节点集,字母表对应数据流,转移函数由具体的组件节点根据数据流中的数据决定下一节点走向,起始状态为HTTP节点的第一个子节点,接受状态集为那些能够响应请求的节点。下面举个简单的示例:

<i:HTTPxmlns:i="//xmlweb"> <i:Routerurl="/index.html"/> <Helloid='hello'/></i:HTTP>

在这个示例可以看成包含两个状态节点的状态机,这两个节点分别是Router和Hello。数据流由HTTP生成,里面包含一个关键的路径数据。当数据流经Router节点时,Router根据数据流中路径是否为/index.html来绝对下一节点的走向,如果路径是 /index.html,那么数据流就往Hello节点流动,否则导致停机,也就是返回一个内置404页面。此示例中的Hello节点即是一个接受状态。

上面的示例非常简单,但是如果使用状态机的嵌套特性,你就可以构建非常强大的web服务应用,更多内容可以查看文档。

静态服务器

下面是一个简单的静态服务器,HTTP节点是一个顶层状态机组件节点,默认侦听8080端口,可以通过设置静态参数listen 来变更。Static节点是一个内置的静态服务组件节点,已实现了缓存、压缩以及断点续传等作为一个HTTP静态服务器应该有的基本功能。

let xmlweb = require("xmlweb");xmlweb("xp", function (xp, $_, t) {    $_().imports({        Index: {            xml:`<i:HTTPxmlns:i="//xmlweb">                    <i:Staticroot="static"/>                 </i:HTTP>`        }    });}).startup("//xp/Index");节点与数据流

状态机节点可以是任何侦听了enter 事件的组件对象。上面的HTTP节点与Static节点都是内置的状态机节点。为了方便起见,你可以把节点看作中间件。下面是一个自定义的状态机节点:

Hello: {    fun: function (sys, items, opts) {        this.on("enter", (e, d) => {            d.res.setHeader("Content-Type", "text/html");            d.res.end("hello, world");        });    }}

注意enter事件的侦听器有一参数d,它代表状态机中数据流,数据流会在节点中流动、变化。

状态机

状态机Flow是xmlweb内置的状态机节点,它可以作为HTTP节点的子级或者Flow节点的子级使用,下面是一个子状态机节点的示例:

<i:Flowxmlns:i="//xmlweb"><Helloid='hello'/></i:Flow>路由

路由组件节点Router也是xmlweb内置的组件节点,它可根据请求类型与URL模式串引导状态机数据流的走向。它通常作为状态机节点的第一个子节点使用。

<i:HTTPxmlns:i='//xmlweb'><i:Routerurl='/index.html'/><Helloid='hello'/></i:HTTP>URL重写与重定向

Rewrite组件节点可将一个进入的URL重新写成另一个URL,下面是一个简单的示例:

<i:HTTPxmlns:i='//xmlweb'><i:Rewritefrom='/'to='/index.html'/><Helloid='hello'/></i:HTTP>

Redirect组件节点用于URL的重定向,该组件节点默认使用状态码为302的重定向:

<i:HTTPxmlns:i='//xmlweb'><i:Redirectto='https://xmlplus.cn'/></i:HTTP>Session

xmlweb提供一个内置的Session组件以提供会话的创建、存储以及移除。

<i:HTTPxmlns:i='//xmlweb'><i:Sessionid='session'/><Responseid='response'/></i:HTTP>

xmlweb内置了一个session的存储驱动组件Storage,它位于命名空间`//xmlweb/session`中。组件Storage将数据以文本形式存放。你可以使用一个实现规定接口的同名组件来覆盖默认的内置组件。

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论