npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

mixer-lib

v0.2.12

Published

兼容多种服务器框架到单个http中, 提供 Utils

Downloads

5

Readme

系统集成库

使用本库可以把多个分散的项目集成到一个 http 服务器中, 而不需要修改项目代码.

安装

npm install mixer-lib --save

配置对象

配置文件在 ./config/config.js 中定义相同, 但配置文件无法设置 whenLoad, 编程配置优先于文件配置, 空余项可以被文件配置补充; ~~不推荐使用 nodejs 的 ssl, nginx 做代理加入 ssl 模块效率更高;~~

var conf = {
  // HTTP 服务端口号
  port      : 81,  

  // 集群配置:
  //  5     设置为5个进程;
  //  0.5   使用一半数量的处理器,
  //  -2    留出 2 个空闲处理器
  //  true  使用全部处理器, 或设置 0
  //  false 单进程
  cluster   : false,

  // 这个参数必须设置
  whenLoad  : Function   

  // 使用 https 创建服务器需要的选项,
  ssl : {     
    // 完整的文件路径             
    key  : 'privatekey.pem',
    cert : 'certificate.pem',
  }
};

使用1 (<=0.1 版本支持)

var mixer = require('mixer-lib');
mixer.create_http_mix_server({ whenLoad : whenLoad });

function whenLoad(app_pool, exdata) {
    var sinopia_app = sinopia(config);
    var sinopia_route = app_pool.addApp(mixer.express(sinopia_app));
    sinopia_route.add('/');

    var mana_route = app_pool.addApp([some_function], '/some');
}

使用2 (>=0.2 版本支持)

相比[使用1]是更方便的 api.

var mixer = require('mixer-lib');
mixer.auto_init(whenLoad, ext_data);

function whenLoad(app_pool, exdata, config) {
    app_pool.addApp(Function, route_path);
}

HTTPS 认证密钥的生成

生成私钥key文件
openssl genrsa -out privatekey.pem 1024

通过私钥生成CSR证书签名
openssl req -new -key privatekey.pem -out certrequest.csr

通过私钥和证书签名生成证书文件
openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem

Events

app_pool 可能发出的消息

beforeFirstLoad

服务器第一次启动之前发出的消息

afterFirstLoad

服务器第一次启动之后发出的消息

beforeEnd

在服务器准备停止之前发出

afterReload

在服务器重新加载之后发出

err_no_start

服务器启动失败, 如果没有对应的监听器将抛出异常到调用 create_http_mix_server 处,
此时进程可能终止.

error

进入服务状态后发生的错误, 如果发生 EADDRINUSE (端口被占用服务不能启动) 错误,
且没有监听器监听 error 事件, 则进程会退出, 退出码 98

API

./test/demo.js 中有可立即运行的代码

function whenLoad(app_pool, exdata, config)

服务器启动/重启时的回调函数, 在函数中使用 app_pool 添加应用.
* app_pool -- 用来注册服务/应用
* exdata   -- 调用 auto_init()/create_http_mix_server() 时传入的参数
* config   -- 全局配置文件

Function serviceApp(request, response, next)

应用/服务函数前面, 可用 app_pool 插入混合器, 当与之关联的路由被请求时回调.
request/response 与 http 库中的相同;
request.base 增加的属性, 用于指明调用当前服务时匹配的根路径
next:Function(err, msg) 被调用后会执行默认应当给客户端, 设置 err 返回 500,
只设置 msg 返回字符串, 否则返回 404.

mixer.create_http_mix_server(config [, ex_data])

创建并启动服务器; config.whenLoad 函数必须设置.  
在加密项目中 (program-crypto-lib) 调用该方法会在日志中写入授权信息, 通常也会打印到屏幕上.

mixer.write_pid(config)

内部函数

mixer.cluster_manager(conf, master_function, slaver_function)

集群管理器, 按照 conf.thcount 数量启动集群; conf.run_on_listenning == true,
则在前一个进程启动 tcp 监听后启动新进程, 否则在前一个进程启动后立即启动新进程.

master_function(config) 主进程任务函数, config 为全局配置文件, 主线程会更新配置文件.
slaver_function(config, address, worker, auto_port) 非主进程任务函数, 副进程不会更新配置文件,

address 为上一个副进程启动后启动 http 服务的地址.
auto_port 用来在集群上产生不同的监听端口, 如果使用这个特性, 一旦端口被占用且进程终止
代码为 98 EADDRINUSE 则副进程启动时会使用一个新的端口 (+1), 这个特性适合使用随机端口的情况.

工作进程如果出现死循环 (同步代码 60 秒未返回), 主进程将杀死它并启动一个新进程.

mixer.auto_init(whenLoad [, ext_data]);

如果调用该方法的模块是全局根模块, 则会启动 http 服务
并读取全局配置文件 (参考 configuration-lib 的 lib.auto_init(...))
否则不会启动服务, 但会尝试导出 whenLoad 函数. 日志中会有记录.
该方法不支持单机集群.

app_pool.addApp(serviceApp [, path_string])

将应用插入混合器, 并返回 route 对象用来设置路由;
或设置 path_string 参数来设置路由路径, 这样可以更方便, 切不需要 route 对象.

app_pool.reload()

重新启动服务器并从磁盘重新加载代码
(条件: 重新加载的代码必须在 whenLoad 函数中被 require)

app_pool.removeApp(route_path)

删除路径对应的应用/服务; 如果应用注册了多个路由, 哪些路由仍然有效

app_pool.on(eventName, callback)

接收服务器发来的事件

route.add(path_string | array | route_saver)

route 是与应用关联的路由设置器, 允许设置多个路由.

mixer.create_route_saver()

创建路由保存器 reoute_saver 可以通过 route.add 插入路由表中.
reoute_saver(path) 可以添加新路由.

mixer.native(Function app())

mixer.express(Function app())

mixer.thinkjs(config)

mixer.dish(Function app())

这些方法用来把为针对特定中间件api写的app转换为 mixer api 的中间件.
返回的对象可以直接调用 app_pool.addApp(...)
(你确定要用 thinkjs ?!)

UTIL 工具

工具库在不使用时并不加载, 不会占用资源

var net = mixer.util.net()

创建网络工具, http 库不支持传递 header.

net.get(url, parm, cb)

* 使用 utf8 编码发送 HTTP.GET 请求
* url  -- 请求url
* parm -- 参数对象 JSON
* cb   -- 完成后的回调: function(err, dataObj)
* dataObj 使用参考 DATA 包

net.post(url, parm, cb)

* 使用 utf8 编码发送 HTTP.POST 请求
* url  -- 请求url
* parm -- 参数对象 JSON
* cb   -- 完成后的回调: function(err, dataObj)
* dataObj 使用参考 DATA 包

var data = mixer.util.data();

创建一个数据包装器  
不要修改包装器 *返回的对象*, 如果需要自行缓存这些对象

构造: 参数必须为字符串:  
`var d = data.fromTxt('some')`

构造: 参数必须是对象  
`var d = data.fromObj({b:1234})`

构造: 参数必须是 xml 字符串  
`var d = data.fromXml("<xml .../>")`

var r = d.txt()

返回原始字符串

var r = d.obj()

返回解析后的 OBJECT, 失败返回 null

var r = d.xml()

返回 XML 字符串, 失败返回 null

var mid = mixer.util.mid()

返回中间件库 MID package

mid.ex_static(localpath, url_prefix)

localpath  - 本地路径  
url_prefix - url 的前缀  
映射一个 url 前缀到本地目录, 该 url 后的所有请求返回
该本地目录中的文件; 并不推荐, 用 masquerade 替代.

mid.ex_log(bootstrap)

ex_log 日志查看服务 (该服务的实现在 logger-lib 中),
bootstrap 的说明见 logger-lib 库.

mid.ex_reload(app_pool)

重启服务, 密码在控制台生成

var lifecycle = mixer.util.lifecycle()

加载可中断定时器库, 与 setInterval 定时器不同, 该定时器通过外部中断可以
让回调延迟到下一个周期中.

lcobj = lifecycle(interval_seconds, task_func)

创建一个定时器实例, 每间隔 interval_seconds 秒调用一次 task_func.

lcobj.update(); lcobj.interrupt(); lcobj.skip();

这些函数都是中断定时器, 使回调函数从调用时间点延迟一个周期.

lcobj.stop(); lcobj.kill(); lcobj.end();

这些函数都是终止定时器, 释放资源.