update
This commit is contained in:
parent
d924db4e1c
commit
7f9e1446ae
|
@ -98,4 +98,25 @@ window.noname_source_list=[
|
||||||
'theme/style/hp/image/hp2.png',
|
'theme/style/hp/image/hp2.png',
|
||||||
'theme/style/hp/image/hp3.png',
|
'theme/style/hp/image/hp3.png',
|
||||||
'theme/style/hp/image/hp4.png',
|
'theme/style/hp/image/hp4.png',
|
||||||
|
'node_modules/ws/index.js',
|
||||||
|
'node_modules/ws/package.json',
|
||||||
|
'node_modules/ws/lib/BufferPool.js',
|
||||||
|
'node_modules/ws/lib/BufferUtil.fallback.js',
|
||||||
|
'node_modules/ws/lib/BufferUtil.js',
|
||||||
|
'node_modules/ws/lib/ErrorCodes.js',
|
||||||
|
'node_modules/ws/lib/Extensions.js',
|
||||||
|
'node_modules/ws/lib/PerMessageDeflate.js',
|
||||||
|
'node_modules/ws/lib/Receiver.hixie.js',
|
||||||
|
'node_modules/ws/lib/Receiver.js',
|
||||||
|
'node_modules/ws/lib/Sender.hixie.js',
|
||||||
|
'node_modules/ws/lib/Sender.js',
|
||||||
|
'node_modules/ws/lib/Validation.fallback.js',
|
||||||
|
'node_modules/ws/lib/Validation.js',
|
||||||
|
'node_modules/ws/lib/WebSocket.js',
|
||||||
|
'node_modules/ws/lib/WebSocketServer.js',
|
||||||
|
'node_modules/ultron/index.js',
|
||||||
|
'node_modules/ultron/package.json',
|
||||||
|
'node_modules/ultron/test.js',
|
||||||
|
'node_modules/options/package.json',
|
||||||
|
'node_modules/options/lib/options.js',
|
||||||
];
|
];
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
window.noname_update={
|
window.noname_update={
|
||||||
version:'1.8.2.0',
|
version:'1.8.2.1',
|
||||||
changeLog:[
|
changeLog:[
|
||||||
'联机预览版(身份模式,标准包)',
|
'联机预览版(身份模式,标准包)',
|
||||||
'新卡牌样式(by @_游离感_ )',
|
'新卡牌样式(by @_游离感_ )',
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
ALL_TESTS = $(shell find test/ -name '*.test.js')
|
|
||||||
|
|
||||||
run-tests:
|
|
||||||
@./node_modules/.bin/mocha \
|
|
||||||
-t 2000 \
|
|
||||||
$(TESTFLAGS) \
|
|
||||||
$(TESTS)
|
|
||||||
|
|
||||||
test:
|
|
||||||
@$(MAKE) NODE_PATH=lib TESTS="$(ALL_TESTS)" run-tests
|
|
||||||
|
|
||||||
.PHONY: test
|
|
|
@ -1,69 +0,0 @@
|
||||||
# options.js #
|
|
||||||
|
|
||||||
A very light-weight in-code option parsers for node.js.
|
|
||||||
|
|
||||||
## Usage ##
|
|
||||||
|
|
||||||
``` js
|
|
||||||
var Options = require("options");
|
|
||||||
|
|
||||||
// Create an Options object
|
|
||||||
function foo(options) {
|
|
||||||
var default_options = {
|
|
||||||
foo : "bar"
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create an option object with default value
|
|
||||||
var opts = new Options(default_options);
|
|
||||||
|
|
||||||
// Merge options
|
|
||||||
opts = opts.merge(options);
|
|
||||||
|
|
||||||
// Reset to default value
|
|
||||||
opts.reset();
|
|
||||||
|
|
||||||
// Copy selected attributes out
|
|
||||||
var seled_att = opts.copy("foo");
|
|
||||||
|
|
||||||
// Read json options from a file.
|
|
||||||
opts.read("options.file"); // Sync
|
|
||||||
opts.read("options.file", function(err){ // Async
|
|
||||||
if(err){ // If error occurs
|
|
||||||
console.log("File error.");
|
|
||||||
}else{
|
|
||||||
// No error
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Attributes defined or not
|
|
||||||
opts.isDefinedAndNonNull("foobar");
|
|
||||||
opts.isDefined("foobar");
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## License ##
|
|
||||||
|
|
||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2012 Einar Otto Stangvik <einaros@gmail.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,22 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2015 Unshift.io, Arnout Kazemier, the Contributors.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
|
@ -1,97 +0,0 @@
|
||||||
# Ultron
|
|
||||||
|
|
||||||
[![Made by unshift](https://img.shields.io/badge/made%20by-unshift-00ffcc.svg?style=flat-square)](http://unshift.io)[![Version npm](http://img.shields.io/npm/v/ultron.svg?style=flat-square)](http://browsenpm.org/package/ultron)[![Build Status](http://img.shields.io/travis/unshiftio/ultron/master.svg?style=flat-square)](https://travis-ci.org/unshiftio/ultron)[![Dependencies](https://img.shields.io/david/unshiftio/ultron.svg?style=flat-square)](https://david-dm.org/unshiftio/ultron)[![Coverage Status](http://img.shields.io/coveralls/unshiftio/ultron/master.svg?style=flat-square)](https://coveralls.io/r/unshiftio/ultron?branch=master)[![IRC channel](http://img.shields.io/badge/IRC-irc.freenode.net%23unshift-00a8ff.svg?style=flat-square)](http://webchat.freenode.net/?channels=unshift)
|
|
||||||
|
|
||||||
Ultron is a high-intelligence robot. It gathers intelligence so it can start
|
|
||||||
improving upon his rudimentary design. It will learn your event emitting
|
|
||||||
patterns and find ways to exterminate them. Allowing you to remove only the
|
|
||||||
event emitters that **you** assigned and not the ones that your users or
|
|
||||||
developers assigned. This can prevent race conditions, memory leaks and even file
|
|
||||||
descriptor leaks from ever happening as you won't remove clean up processes.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
The module is designed to be used in browsers using browserify and in Node.js.
|
|
||||||
You can install the module through the public npm registry by running the
|
|
||||||
following command in CLI:
|
|
||||||
|
|
||||||
```
|
|
||||||
npm install --save ultron
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
In all examples we assume that you've required the library as following:
|
|
||||||
|
|
||||||
```js
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
var Ultron = require('ultron');
|
|
||||||
```
|
|
||||||
|
|
||||||
Now that we've required the library we can construct our first `Ultron` instance.
|
|
||||||
The constructor requires one argument which should be the `EventEmitter`
|
|
||||||
instance that we need to operate upon. This can be the `EventEmitter` module
|
|
||||||
that ships with Node.js or `EventEmitter3` or anything else as long as it
|
|
||||||
follow the same API and internal structure as these 2. So with that in mind we
|
|
||||||
can create the instance:
|
|
||||||
|
|
||||||
```js
|
|
||||||
//
|
|
||||||
// For the sake of this example we're going to construct an empty EventEmitter
|
|
||||||
//
|
|
||||||
var EventEmitter = require('events').EventEmitter; // or require('eventmitter3');
|
|
||||||
var events = new EventEmitter();
|
|
||||||
|
|
||||||
var ultron = new Ultron(events);
|
|
||||||
```
|
|
||||||
|
|
||||||
You can now use the following API's from the Ultron instance:
|
|
||||||
|
|
||||||
### Ultron.on
|
|
||||||
|
|
||||||
Register a new event listener for the given event. It follows the exact same API
|
|
||||||
as `EventEmitter.on` but it will return itself instead of returning the
|
|
||||||
EventEmitter instance. If you are using EventEmitter3 it also supports the
|
|
||||||
context param:
|
|
||||||
|
|
||||||
```js
|
|
||||||
ultron.on('event-name', handler, { custom: 'function context' });
|
|
||||||
```
|
|
||||||
|
|
||||||
### Ultron.once
|
|
||||||
|
|
||||||
Exactly the same as the [Ultron.on](#ultronon) but it only allows the execution
|
|
||||||
once.
|
|
||||||
|
|
||||||
### Ultron.remove
|
|
||||||
|
|
||||||
This is where all the magic happens and the safe removal starts. This function
|
|
||||||
accepts different argument styles:
|
|
||||||
|
|
||||||
- No arguments, assume that all events need to be removed so it will work as
|
|
||||||
`removeAllListeners()` API.
|
|
||||||
- 1 argument, when it's a string it will be split on ` ` and `,` to create a
|
|
||||||
list of events that need to be cleared.
|
|
||||||
- Multiple arguments, we assume that they are all names of events that need to
|
|
||||||
be cleared.
|
|
||||||
|
|
||||||
```js
|
|
||||||
ultron.remove('foo, bar baz'); // Removes foo, bar and baz.
|
|
||||||
ultron.remove('foo', 'bar', 'baz'); // Removes foo, bar and baz.
|
|
||||||
ultron.remove(); // Removes everything.
|
|
||||||
```
|
|
||||||
|
|
||||||
If you just want to remove a single event listener using a function reference
|
|
||||||
you can still use the EventEmitter's `removeListener(event, fn)` API:
|
|
||||||
|
|
||||||
```js
|
|
||||||
function foo() {}
|
|
||||||
|
|
||||||
ulton.on('foo', foo);
|
|
||||||
events.removeListener('foo', foo);
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
MIT
|
|
|
@ -1,40 +0,0 @@
|
||||||
ALL_TESTS = $(shell find test/ -name '*.test.js')
|
|
||||||
ALL_INTEGRATION = $(shell find test/ -name '*.integration.js')
|
|
||||||
|
|
||||||
all:
|
|
||||||
node-gyp configure build
|
|
||||||
|
|
||||||
clean:
|
|
||||||
node-gyp clean
|
|
||||||
|
|
||||||
run-tests:
|
|
||||||
@./node_modules/.bin/mocha \
|
|
||||||
-t 5000 \
|
|
||||||
-s 2400 \
|
|
||||||
$(TESTFLAGS) \
|
|
||||||
$(TESTS)
|
|
||||||
|
|
||||||
run-integrationtests:
|
|
||||||
@./node_modules/.bin/mocha \
|
|
||||||
-t 5000 \
|
|
||||||
-s 6000 \
|
|
||||||
$(TESTFLAGS) \
|
|
||||||
$(TESTS)
|
|
||||||
|
|
||||||
test:
|
|
||||||
@$(MAKE) NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_PATH=lib TESTS="$(ALL_TESTS)" run-tests
|
|
||||||
|
|
||||||
integrationtest:
|
|
||||||
@$(MAKE) NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_PATH=lib TESTS="$(ALL_INTEGRATION)" run-integrationtests
|
|
||||||
|
|
||||||
benchmark:
|
|
||||||
@node bench/sender.benchmark.js
|
|
||||||
@node bench/parser.benchmark.js
|
|
||||||
|
|
||||||
autobahn:
|
|
||||||
@NODE_PATH=lib node test/autobahn.js
|
|
||||||
|
|
||||||
autobahn-server:
|
|
||||||
@NODE_PATH=lib node test/autobahn-server.js
|
|
||||||
|
|
||||||
.PHONY: test
|
|
|
@ -1,242 +0,0 @@
|
||||||
# ws: a node.js websocket library
|
|
||||||
|
|
||||||
[![Build Status](https://travis-ci.org/websockets/ws.svg?branch=master)](https://travis-ci.org/websockets/ws)
|
|
||||||
|
|
||||||
`ws` is a simple to use WebSocket implementation, up-to-date against RFC-6455,
|
|
||||||
and [probably the fastest WebSocket library for node.js][archive].
|
|
||||||
|
|
||||||
Passes the quite extensive Autobahn test suite. See http://websockets.github.com/ws
|
|
||||||
for the full reports.
|
|
||||||
|
|
||||||
## Protocol support
|
|
||||||
|
|
||||||
* **Hixie draft 76** (Old and deprecated, but still in use by Safari and Opera.
|
|
||||||
Added to ws version 0.4.2, but server only. Can be disabled by setting the
|
|
||||||
`disableHixie` option to true.)
|
|
||||||
* **HyBi drafts 07-12** (Use the option `protocolVersion: 8`)
|
|
||||||
* **HyBi drafts 13-17** (Current default, alternatively option `protocolVersion: 13`)
|
|
||||||
|
|
||||||
### Installing
|
|
||||||
|
|
||||||
```
|
|
||||||
npm install --save ws
|
|
||||||
```
|
|
||||||
|
|
||||||
### Opt-in for performance
|
|
||||||
|
|
||||||
There are 2 optional modules that can be installed along side with the `ws`
|
|
||||||
module. These modules are binary addons which improve certain operations, but as
|
|
||||||
they are binary addons they require compilation which can fail if no c++
|
|
||||||
compiler is installed on the host system.
|
|
||||||
|
|
||||||
- `npm install --save bufferutil`: Improves internal buffer operations which
|
|
||||||
allows for faster processing of masked WebSocket frames and general buffer
|
|
||||||
operations.
|
|
||||||
- `npm install --save utf-8-validate`: The specification requires validation of
|
|
||||||
invalid UTF-8 chars, some of these validations could not be done in JavaScript
|
|
||||||
hence the need for a binary addon. In most cases you will already be
|
|
||||||
validating the input that you receive for security purposes leading to double
|
|
||||||
validation. But if you want to be 100% spec conform and fast validation of UTF-8
|
|
||||||
then this module is a must.
|
|
||||||
|
|
||||||
### Sending and receiving text data
|
|
||||||
|
|
||||||
```js
|
|
||||||
var WebSocket = require('ws');
|
|
||||||
var ws = new WebSocket('ws://www.host.com/path');
|
|
||||||
|
|
||||||
ws.on('open', function open() {
|
|
||||||
ws.send('something');
|
|
||||||
});
|
|
||||||
|
|
||||||
ws.on('message', function(data, flags) {
|
|
||||||
// flags.binary will be set if a binary data is received.
|
|
||||||
// flags.masked will be set if the data was masked.
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### Sending binary data
|
|
||||||
|
|
||||||
```js
|
|
||||||
var WebSocket = require('ws');
|
|
||||||
var ws = new WebSocket('ws://www.host.com/path');
|
|
||||||
|
|
||||||
ws.on('open', function open() {
|
|
||||||
var array = new Float32Array(5);
|
|
||||||
|
|
||||||
for (var i = 0; i < array.length; ++i) {
|
|
||||||
array[i] = i / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
ws.send(array, { binary: true, mask: true });
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
Setting `mask`, as done for the send options above, will cause the data to be
|
|
||||||
masked according to the WebSocket protocol. The same option applies for text
|
|
||||||
data.
|
|
||||||
|
|
||||||
### Server example
|
|
||||||
|
|
||||||
```js
|
|
||||||
var WebSocketServer = require('ws').Server
|
|
||||||
, wss = new WebSocketServer({ port: 8080 });
|
|
||||||
|
|
||||||
wss.on('connection', function connection(ws) {
|
|
||||||
ws.on('message', function incoming(message) {
|
|
||||||
console.log('received: %s', message);
|
|
||||||
});
|
|
||||||
|
|
||||||
ws.send('something');
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### ExpressJS example
|
|
||||||
|
|
||||||
```js
|
|
||||||
var server = require('http').createServer()
|
|
||||||
, url = require('url')
|
|
||||||
, WebSocketServer = require('ws').Server
|
|
||||||
, wss = new WebSocketServer({ server: server })
|
|
||||||
, express = require('express')
|
|
||||||
, app = express()
|
|
||||||
, port = 4080;
|
|
||||||
|
|
||||||
app.use(function (req, res) {
|
|
||||||
res.send({ msg: "hello" });
|
|
||||||
});
|
|
||||||
|
|
||||||
wss.on('connection', function connection(ws) {
|
|
||||||
var location = url.parse(ws.upgradeReq.url, true);
|
|
||||||
// you might use location.query.access_token to authenticate or share sessions
|
|
||||||
// or ws.upgradeReq.headers.cookie (see http://stackoverflow.com/a/16395220/151312)
|
|
||||||
|
|
||||||
ws.on('message', function incoming(message) {
|
|
||||||
console.log('received: %s', message);
|
|
||||||
});
|
|
||||||
|
|
||||||
ws.send('something');
|
|
||||||
});
|
|
||||||
|
|
||||||
server.on('request', app);
|
|
||||||
server.listen(port, function () { console.log('Listening on ' + server.address().port) });
|
|
||||||
```
|
|
||||||
|
|
||||||
### Server sending broadcast data
|
|
||||||
|
|
||||||
```js
|
|
||||||
var WebSocketServer = require('ws').Server
|
|
||||||
, wss = new WebSocketServer({ port: 8080 });
|
|
||||||
|
|
||||||
wss.broadcast = function broadcast(data) {
|
|
||||||
wss.clients.forEach(function each(client) {
|
|
||||||
client.send(data);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
### Error handling best practices
|
|
||||||
|
|
||||||
```js
|
|
||||||
// If the WebSocket is closed before the following send is attempted
|
|
||||||
ws.send('something');
|
|
||||||
|
|
||||||
// Errors (both immediate and async write errors) can be detected in an optional
|
|
||||||
// callback. The callback is also the only way of being notified that data has
|
|
||||||
// actually been sent.
|
|
||||||
ws.send('something', function ack(error) {
|
|
||||||
// if error is not defined, the send has been completed,
|
|
||||||
// otherwise the error object will indicate what failed.
|
|
||||||
});
|
|
||||||
|
|
||||||
// Immediate errors can also be handled with try/catch-blocks, but **note** that
|
|
||||||
// since sends are inherently asynchronous, socket write failures will *not* be
|
|
||||||
// captured when this technique is used.
|
|
||||||
try { ws.send('something'); }
|
|
||||||
catch (e) { /* handle error */ }
|
|
||||||
```
|
|
||||||
|
|
||||||
### echo.websocket.org demo
|
|
||||||
|
|
||||||
```js
|
|
||||||
var WebSocket = require('ws');
|
|
||||||
var ws = new WebSocket('ws://echo.websocket.org/', {
|
|
||||||
protocolVersion: 8,
|
|
||||||
origin: 'http://websocket.org'
|
|
||||||
});
|
|
||||||
|
|
||||||
ws.on('open', function open() {
|
|
||||||
console.log('connected');
|
|
||||||
ws.send(Date.now().toString(), {mask: true});
|
|
||||||
});
|
|
||||||
|
|
||||||
ws.on('close', function close() {
|
|
||||||
console.log('disconnected');
|
|
||||||
});
|
|
||||||
|
|
||||||
ws.on('message', function message(data, flags) {
|
|
||||||
console.log('Roundtrip time: ' + (Date.now() - parseInt(data)) + 'ms', flags);
|
|
||||||
|
|
||||||
setTimeout(function timeout() {
|
|
||||||
ws.send(Date.now().toString(), {mask: true});
|
|
||||||
}, 500);
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### Browserify users
|
|
||||||
When including ws via a browserify bundle, ws returns global.WebSocket which has slightly different API.
|
|
||||||
You should use the standard WebSockets API instead.
|
|
||||||
|
|
||||||
https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_client_applications#Availability_of_WebSockets
|
|
||||||
|
|
||||||
|
|
||||||
### Other examples
|
|
||||||
|
|
||||||
For a full example with a browser client communicating with a ws server, see the
|
|
||||||
examples folder.
|
|
||||||
|
|
||||||
Note that the usage together with Express 3.0 is quite different from Express
|
|
||||||
2.x. The difference is expressed in the two different serverstats-examples.
|
|
||||||
|
|
||||||
Otherwise, see the test cases.
|
|
||||||
|
|
||||||
### Running the tests
|
|
||||||
|
|
||||||
```
|
|
||||||
make test
|
|
||||||
```
|
|
||||||
|
|
||||||
## API Docs
|
|
||||||
|
|
||||||
See [`/doc/ws.md`](https://github.com/websockets/ws/blob/master/doc/ws.md) for Node.js-like docs for the ws classes.
|
|
||||||
|
|
||||||
## Changelog
|
|
||||||
|
|
||||||
We're using the GitHub [`releases`](https://github.com/websockets/ws/releases) for changelog entries.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
'Software'), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
||||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
[archive]: http://web.archive.org/web/20130314230536/http://hobbycoding.posterous.com/the-fastest-websocket-module-for-nodejs
|
|
Loading…
Reference in New Issue