mirror of
https://github.com/ckaczor/LaundryMonitor.git
synced 2026-01-13 17:22:55 -05:00
Move project to GitHub and hide Telegram config
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
node_modules/
|
||||
release/
|
||||
21
LICENSE.md
Normal file
21
LICENSE.md
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2018 Chris Kaczor
|
||||
|
||||
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.
|
||||
11
README.md
Normal file
11
README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# LaundryMonitor
|
||||
|
||||
Monitors washing machine and dryer status.
|
||||
|
||||
## Authors
|
||||
|
||||
* **Chris Kaczor** - *Initial work* - https://github.com/ckaczor - https://chriskaczor.com
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details.
|
||||
13
app/config.d.ts
vendored
Normal file
13
app/config.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
export interface IConfig {
|
||||
port: number;
|
||||
refreshInterval: number;
|
||||
deviceDebounceInterval: number;
|
||||
|
||||
botToken: string;
|
||||
|
||||
chatId: string;
|
||||
debugChatId: string;
|
||||
|
||||
debug: boolean;
|
||||
enableTelegram: boolean;
|
||||
}
|
||||
17
app/config.ts
Normal file
17
app/config.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { IConfig } from './config.d';
|
||||
|
||||
class Config implements IConfig {
|
||||
port = 80;
|
||||
refreshInterval = 500;
|
||||
deviceDebounceInterval = 10000;
|
||||
|
||||
botToken = 'BOT-TOKEN';
|
||||
|
||||
chatId = 'CHAT-ID';
|
||||
debugChatId = 'DEBUG-CHAT-ID';
|
||||
|
||||
debug = false;
|
||||
enableTelegram = true;
|
||||
}
|
||||
|
||||
export const config = new Config();
|
||||
100
app/device.ts
Normal file
100
app/device.ts
Normal file
@@ -0,0 +1,100 @@
|
||||
import _ = require('underscore');
|
||||
import bunyan = require('bunyan');
|
||||
import gpio = require('onoff');
|
||||
|
||||
export var log: bunyan.Logger;
|
||||
|
||||
export class DeviceConfiguration {
|
||||
key: string;
|
||||
pin: number;
|
||||
}
|
||||
|
||||
export class DeviceListConfiguration {
|
||||
pollInterval: number;
|
||||
deviceConfiguration: Array<DeviceConfiguration>;
|
||||
deviceUpdateCallback: (device: Device, initialUpdate: boolean) => void;
|
||||
}
|
||||
|
||||
export class DeviceList {
|
||||
private deviceList: { [key: string]: Device };
|
||||
|
||||
constructor(private configuration: DeviceListConfiguration) {
|
||||
this.deviceList = {};
|
||||
|
||||
configuration.deviceConfiguration.forEach((deviceConfiguration: DeviceConfiguration) => {
|
||||
this.createDevice(deviceConfiguration.key, deviceConfiguration.pin);
|
||||
});
|
||||
|
||||
this.update(true);
|
||||
|
||||
setInterval(this.update.bind(this), configuration.pollInterval);
|
||||
}
|
||||
|
||||
private createDevice(key: string, pin: number): Device {
|
||||
const device = new Device(key, pin);
|
||||
|
||||
this.deviceList[key] = device;
|
||||
|
||||
return device;
|
||||
}
|
||||
|
||||
getDevices(): Array<Device> {
|
||||
return _.toArray<Device>(this.deviceList);
|
||||
}
|
||||
|
||||
getStatus(): any {
|
||||
var status: { [key: string]: boolean } = {};
|
||||
|
||||
_.each(this.deviceList, (device: Device) => {
|
||||
status[device.key] = device.value;
|
||||
});
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
private update(initialUpdate: boolean = false) {
|
||||
_.each(this.deviceList, (device: Device) => {
|
||||
var deviceChanged = device.update();
|
||||
|
||||
if (deviceChanged) {
|
||||
this.configuration.deviceUpdateCallback(device, initialUpdate);
|
||||
|
||||
if (log) {
|
||||
log.info(`DeviceList.Update - ${device.toString()}`);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export class Device {
|
||||
private gpioPin: gpio.Gpio;
|
||||
|
||||
value: boolean;
|
||||
|
||||
constructor(public key: string, pin: number) {
|
||||
this.gpioPin = new gpio.Gpio(pin, 'in', 'both');
|
||||
}
|
||||
|
||||
toString(): string {
|
||||
return `Device: ${this.key} = ${this.value}`;
|
||||
}
|
||||
|
||||
getStatus(): any {
|
||||
const status: { [key: string]: boolean } = {};
|
||||
|
||||
status[this.key] = this.value;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
update(): boolean {
|
||||
const newValue = this.gpioPin.readSync() === 0;
|
||||
|
||||
const changed = (this.value !== newValue);
|
||||
|
||||
this.value = newValue;
|
||||
|
||||
return changed;
|
||||
}
|
||||
}
|
||||
164
app/main.ts
Normal file
164
app/main.ts
Normal file
@@ -0,0 +1,164 @@
|
||||
/// <reference path="../typings/express/express.d.ts" />
|
||||
/// <reference path="../typings/onoff/onoff.d.ts" />
|
||||
/// <reference path="../typings/request/request.d.ts" />
|
||||
/// <reference path="../typings/tsd.d.ts" />
|
||||
|
||||
// ---
|
||||
|
||||
import os = require('os');
|
||||
import bunyan = require('bunyan');
|
||||
import express = require('express');
|
||||
import http = require('http');
|
||||
import socketio = require('socket.io');
|
||||
import request = require('request');
|
||||
|
||||
import device = require('./device');
|
||||
import Device = device.Device;
|
||||
|
||||
import config = require('./config');
|
||||
import Config = config.config;
|
||||
|
||||
var app = express();
|
||||
var server = http.createServer(app);
|
||||
var io = socketio(server);
|
||||
|
||||
// ---
|
||||
|
||||
var log = bunyan.createLogger({
|
||||
name: 'laundry_monitor',
|
||||
streams: [
|
||||
{
|
||||
type: 'rotating-file',
|
||||
path: '/var/log/laundry_monitor.log',
|
||||
period: '1d',
|
||||
count: 3
|
||||
},
|
||||
{
|
||||
stream: process.stdout
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
device.log = log;
|
||||
|
||||
// ---
|
||||
|
||||
log.info('Setting up devices');
|
||||
|
||||
var deviceListConfiguration: device.DeviceListConfiguration = {
|
||||
pollInterval: Config.refreshInterval,
|
||||
deviceConfiguration: [{ key: 'washer', pin: 413 }, { key: 'dryer', pin: 415 }],
|
||||
deviceUpdateCallback: (device: Device, initialUpdate: boolean) => {
|
||||
if (initialUpdate) {
|
||||
return;
|
||||
}
|
||||
|
||||
queueDeviceUpdate(device, undefined, 'The {name} is now {status}.');
|
||||
}
|
||||
};
|
||||
|
||||
var devices = new device.DeviceList(deviceListConfiguration);
|
||||
|
||||
// ---
|
||||
|
||||
const deviceLastState: { [key: string]: boolean } = {};
|
||||
const deviceUpdateQueue: { [key: string]: number } = {};
|
||||
|
||||
function queueDeviceUpdate(device: Device, header: string, deviceTemplate: string) {
|
||||
if (deviceUpdateQueue[device.key]) {
|
||||
log.info(`queueDeviceUpdate - Stopping old timer for device: ${device.key}`);
|
||||
clearTimeout(deviceUpdateQueue[device.key]);
|
||||
}
|
||||
|
||||
log.info(`queueDeviceUpdate - Starting new timer for device: ${device.key}`);
|
||||
|
||||
deviceUpdateQueue[device.key] = setTimeout(() => {
|
||||
if (deviceLastState[device.key] !== device.value) {
|
||||
sendTelegramDeviceUpdate([device], header, deviceTemplate);
|
||||
emitStatus(device.getStatus());
|
||||
} else {
|
||||
log.info(`queueDeviceUpdate - No change for device: ${device.key}`);
|
||||
}
|
||||
|
||||
delete deviceUpdateQueue[device.key];
|
||||
}, Config.deviceDebounceInterval) as any;
|
||||
}
|
||||
|
||||
function sendTelegramDeviceUpdate(devices: Array<Device>, header: string, deviceTemplate: string) {
|
||||
let telegramMessage = header || '';
|
||||
|
||||
devices.forEach((device: Device) => {
|
||||
deviceLastState[device.key] = device.value;
|
||||
|
||||
const deviceLine = deviceTemplate.replace('{name}', device.key).replace('{status}', device.value ? 'ON' : 'OFF');
|
||||
|
||||
telegramMessage += `${deviceLine}\n`;
|
||||
});
|
||||
|
||||
if (telegramMessage.length > 0) {
|
||||
sendTelegramMessage(telegramMessage);
|
||||
}
|
||||
}
|
||||
|
||||
function sendTelegramMessage(message: string) {
|
||||
log.info(`Telegram message: ${message}`);
|
||||
|
||||
if (!Config.enableTelegram) {
|
||||
return;
|
||||
}
|
||||
|
||||
const sendChatId = Config.debug ? Config.debugChatId : Config.chatId;
|
||||
|
||||
const url = `https://api.telegram.org/bot${Config.botToken}/sendMessage?chat_id=${sendChatId}&text=${encodeURIComponent(message)}`;
|
||||
|
||||
request(url);
|
||||
}
|
||||
|
||||
// ---
|
||||
|
||||
log.info('Starting web server');
|
||||
|
||||
app.get('/getStatus', (request, response) => {
|
||||
const data = devices.getStatus();
|
||||
|
||||
response.end(JSON.stringify(data));
|
||||
});
|
||||
|
||||
server.listen(Config.port, () => {
|
||||
const host = os.hostname();
|
||||
|
||||
log.info(`Listening at http://${host}:${Config.port}`);
|
||||
});
|
||||
|
||||
// ---
|
||||
|
||||
log.info('Starting socket.io server');
|
||||
|
||||
function emitStatus(status: any) {
|
||||
const socketMessage = JSON.stringify(status);
|
||||
|
||||
log.info(`emitStatus: ${socketMessage}`);
|
||||
|
||||
io.emit('status', socketMessage);
|
||||
}
|
||||
|
||||
io.on('connection', (socket: SocketIO.Socket) => {
|
||||
log.info('socket.io: connection');
|
||||
|
||||
socket.on('getStatus', () => {
|
||||
log.info('socket.io: getStatus');
|
||||
|
||||
emitStatus(devices.getStatus());
|
||||
});
|
||||
|
||||
socket.on('disconnect', () => {
|
||||
log.info('socket.io: disconnect');
|
||||
});
|
||||
});
|
||||
|
||||
// ---
|
||||
|
||||
log.info('Ready');
|
||||
|
||||
emitStatus(devices.getStatus());
|
||||
sendTelegramDeviceUpdate(devices.getDevices(), 'Powering up!\n\n', 'The {name} is currently {status}.');
|
||||
44
gulpfile.js
Normal file
44
gulpfile.js
Normal file
@@ -0,0 +1,44 @@
|
||||
var gulp = require('gulp');
|
||||
var ts = require('gulp-typescript');
|
||||
var merge = require('merge2');
|
||||
var runSequence = require('run-sequence');
|
||||
var dirSync = require('gulp-directory-sync');
|
||||
|
||||
gulp.task('transpile', function () {
|
||||
var tsResult = gulp.src('app/*.ts')
|
||||
.pipe(ts({
|
||||
declarationFiles: false,
|
||||
noResolve: false,
|
||||
noImplicitAny: true,
|
||||
module: 'commonjs',
|
||||
moduleResolution: 'node',
|
||||
outDir: 'release'
|
||||
}));
|
||||
|
||||
return merge([
|
||||
tsResult.dts.pipe(gulp.dest('release/definitions')),
|
||||
tsResult.js.pipe(gulp.dest('release'))
|
||||
]);
|
||||
});
|
||||
|
||||
gulp.task('watch', function () {
|
||||
gulp.watch(['app/**/*', 'scripts/**/*'], ['build']);
|
||||
});
|
||||
|
||||
gulp.task('deploy', function () {
|
||||
return gulp.src('')
|
||||
.pipe(dirSync('release', '/mnt/chip/laundry_monitor', { printSummary: true, ignore: ['node_modules', '.foreverignore'] }))
|
||||
.on('error', function () { });
|
||||
});
|
||||
|
||||
gulp.task('package', function () {
|
||||
gulp.src('package.json').pipe(gulp.dest('release'));
|
||||
gulp.src('scripts/*.sh').pipe(gulp.dest('release'));
|
||||
gulp.src('app/index.html').pipe(gulp.dest('release'));
|
||||
});
|
||||
|
||||
gulp.task('build', function (done) {
|
||||
runSequence('transpile', 'package', 'deploy', function () {
|
||||
done();
|
||||
});
|
||||
});
|
||||
4471
package-lock.json
generated
Normal file
4471
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
27
package.json
Normal file
27
package.json
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "laundry-monitor",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "Chris Kaczor",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"gulp": "^3.9.1",
|
||||
"gulp-directory-sync": "^1.2.3",
|
||||
"gulp-typescript": "^3.1.2",
|
||||
"merge2": "^1.0.2",
|
||||
"run-sequence": "^1.2.2",
|
||||
"typescript": "^2.0.9"
|
||||
},
|
||||
"dependencies": {
|
||||
"bunyan": "^1.8.4",
|
||||
"express": "^4.14.0",
|
||||
"onoff": "^1.1.1",
|
||||
"request": "^2.78.0",
|
||||
"socket.io": "^1.5.1",
|
||||
"underscore": "^1.8.3"
|
||||
}
|
||||
}
|
||||
2
scripts/debug.sh
Normal file
2
scripts/debug.sh
Normal file
@@ -0,0 +1,2 @@
|
||||
touch /home/ckaczor/laundry_monitor/.foreverignore
|
||||
sudo forever --minUptime 1000 --spinSleepTime 1000 --watch --watchIgnore *.html --watchDirectory /home/ckaczor/laundry_monitor /home/ckaczor/laundry_monitor/main.js | bunyan
|
||||
2
scripts/start.sh
Normal file
2
scripts/start.sh
Normal file
@@ -0,0 +1,2 @@
|
||||
touch /home/ckaczor/laundry_monitor/.foreverignore
|
||||
sudo forever start --minUptime 1000 --spinSleepTime 1000 --watch --watchIgnore *.html --watchDirectory /home/ckaczor/laundry_monitor /home/ckaczor/laundry_monitor/main.js > /dev/null
|
||||
7
tsconfig.json
Normal file
7
tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"module": "commonjs",
|
||||
"sourceMap": true
|
||||
}
|
||||
}
|
||||
39
tsd.json
Normal file
39
tsd.json
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"version": "v4",
|
||||
"repo": "borisyankov/DefinitelyTyped",
|
||||
"ref": "master",
|
||||
"path": "typings",
|
||||
"bundle": "typings/tsd.d.ts",
|
||||
"installed": {
|
||||
"node/node.d.ts": {
|
||||
"commit": "f5ab2df94e1aabf0fc6d783ad01c4c4671760627"
|
||||
},
|
||||
"socket.io/socket.io.d.ts": {
|
||||
"commit": "7fffbd3e040a93c244777e3be04cd6223ac69301"
|
||||
},
|
||||
"bunyan/bunyan.d.ts": {
|
||||
"commit": "7fffbd3e040a93c244777e3be04cd6223ac69301"
|
||||
},
|
||||
"express/express.d.ts": {
|
||||
"commit": "7b3d5a6ea5acda4a81f71309f1cc62354e63b681"
|
||||
},
|
||||
"mime/mime.d.ts": {
|
||||
"commit": "7b3d5a6ea5acda4a81f71309f1cc62354e63b681"
|
||||
},
|
||||
"serve-static/serve-static.d.ts": {
|
||||
"commit": "7b3d5a6ea5acda4a81f71309f1cc62354e63b681"
|
||||
},
|
||||
"underscore/underscore.d.ts": {
|
||||
"commit": "86dbea8fc37d9473fee465da4f0a21bea4f8cbd9"
|
||||
},
|
||||
"onoff/onoff.d.ts": {
|
||||
"commit": "f5ab2df94e1aabf0fc6d783ad01c4c4671760627"
|
||||
},
|
||||
"request/request.d.ts": {
|
||||
"commit": "f5ab2df94e1aabf0fc6d783ad01c4c4671760627"
|
||||
},
|
||||
"form-data/form-data.d.ts": {
|
||||
"commit": "f5ab2df94e1aabf0fc6d783ad01c4c4671760627"
|
||||
}
|
||||
}
|
||||
}
|
||||
56
tslint.json
Normal file
56
tslint.json
Normal file
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"rules": {
|
||||
"class-name": true,
|
||||
"comment-format": [
|
||||
true,
|
||||
"check-space"
|
||||
],
|
||||
"indent": [
|
||||
true,
|
||||
"tabs"
|
||||
],
|
||||
"no-duplicate-variable": true,
|
||||
"no-eval": true,
|
||||
"no-internal-module": false,
|
||||
"no-trailing-whitespace": false,
|
||||
"no-var-keyword": true,
|
||||
"one-line": [
|
||||
true,
|
||||
"check-open-brace",
|
||||
"check-whitespace"
|
||||
],
|
||||
"quotemark": [
|
||||
true,
|
||||
"single"
|
||||
],
|
||||
"semicolon": [
|
||||
true
|
||||
],
|
||||
"triple-equals": [
|
||||
true,
|
||||
"allow-null-check"
|
||||
],
|
||||
"typedef-whitespace": [
|
||||
true,
|
||||
{
|
||||
"call-signature": "nospace",
|
||||
"index-signature": "nospace",
|
||||
"parameter": "nospace",
|
||||
"property-declaration": "nospace",
|
||||
"variable-declaration": "nospace"
|
||||
}
|
||||
],
|
||||
"variable-name": [
|
||||
true,
|
||||
"ban-keywords"
|
||||
],
|
||||
"whitespace": [
|
||||
true,
|
||||
"check-branch",
|
||||
"check-decl",
|
||||
"check-operator",
|
||||
"check-separator",
|
||||
"check-type"
|
||||
]
|
||||
}
|
||||
}
|
||||
102
typings/bunyan/bunyan.d.ts
vendored
Normal file
102
typings/bunyan/bunyan.d.ts
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
// Type definitions for node-bunyan
|
||||
// Project: https://github.com/trentm/node-bunyan
|
||||
// Definitions by: Alex Mikhalev <https://github.com/amikhalev>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/// <reference path="../node/node.d.ts" />
|
||||
|
||||
declare module "bunyan" {
|
||||
import { EventEmitter } from 'events';
|
||||
|
||||
class Logger extends EventEmitter {
|
||||
constructor(options:LoggerOptions);
|
||||
addStream(stream:Stream):void;
|
||||
addSerializers(serializers:Serializers):void;
|
||||
child(options:LoggerOptions, simple?:boolean):Logger;
|
||||
child(obj:Object, simple?:boolean):Logger;
|
||||
reopenFileStreams():void;
|
||||
|
||||
level():string|number;
|
||||
level(value: number | string):void;
|
||||
levels(name: number | string, value: number | string):void;
|
||||
|
||||
trace(error:Error, format?:any, ...params:any[]):void;
|
||||
trace(buffer:Buffer, format?:any, ...params:any[]):void;
|
||||
trace(obj:Object, format?:any, ...params:any[]):void;
|
||||
trace(format:string, ...params:any[]):void;
|
||||
debug(error:Error, format?:any, ...params:any[]):void;
|
||||
debug(buffer:Buffer, format?:any, ...params:any[]):void;
|
||||
debug(obj:Object, format?:any, ...params:any[]):void;
|
||||
debug(format:string, ...params:any[]):void;
|
||||
info(error:Error, format?:any, ...params:any[]):void;
|
||||
info(buffer:Buffer, format?:any, ...params:any[]):void;
|
||||
info(obj:Object, format?:any, ...params:any[]):void;
|
||||
info(format:string, ...params:any[]):void;
|
||||
warn(error:Error, format?:any, ...params:any[]):void;
|
||||
warn(buffer:Buffer, format?:any, ...params:any[]):void;
|
||||
warn(obj:Object, format?:any, ...params:any[]):void;
|
||||
warn(format:string, ...params:any[]):void;
|
||||
error(error:Error, format?:any, ...params:any[]):void;
|
||||
error(buffer:Buffer, format?:any, ...params:any[]):void;
|
||||
error(obj:Object, format?:any, ...params:any[]):void;
|
||||
error(format:string, ...params:any[]):void;
|
||||
fatal(error:Error, format?:any, ...params:any[]):void;
|
||||
fatal(buffer:Buffer, format?:any, ...params:any[]):void;
|
||||
fatal(obj:Object, format?:any, ...params:any[]):void;
|
||||
fatal(format:string, ...params:any[]):void;
|
||||
}
|
||||
|
||||
interface LoggerOptions {
|
||||
name: string;
|
||||
streams?: Stream[];
|
||||
level?: string | number;
|
||||
stream?: NodeJS.WritableStream;
|
||||
serializers?: Serializers;
|
||||
src?: boolean;
|
||||
}
|
||||
|
||||
interface Serializers {
|
||||
[key:string]: (input:any) => string;
|
||||
}
|
||||
|
||||
interface Stream {
|
||||
type?: string;
|
||||
level?: number | string;
|
||||
path?: string;
|
||||
stream?: NodeJS.WritableStream | Stream;
|
||||
closeOnExit?: boolean;
|
||||
period?: string;
|
||||
count?: number;
|
||||
}
|
||||
|
||||
export var stdSerializers:Serializers;
|
||||
|
||||
export var TRACE:number;
|
||||
export var DEBUG:number;
|
||||
export var INFO:number;
|
||||
export var WARN:number;
|
||||
export var ERROR:number;
|
||||
export var FATAL:number;
|
||||
|
||||
export function resolveLevel(value: number | string):number;
|
||||
|
||||
export function createLogger(options:LoggerOptions):Logger;
|
||||
|
||||
class RingBuffer extends EventEmitter {
|
||||
constructor(options:RingBufferOptions);
|
||||
|
||||
writable:boolean;
|
||||
records:any[];
|
||||
|
||||
write(record:any):void;
|
||||
end(record?:any):void;
|
||||
destroy():void;
|
||||
destroySoon():void;
|
||||
}
|
||||
|
||||
interface RingBufferOptions {
|
||||
limit?: number;
|
||||
}
|
||||
|
||||
export function safeCycles():(key:string, value:any) => any;
|
||||
}
|
||||
1076
typings/express/express.d.ts
vendored
Normal file
1076
typings/express/express.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
25
typings/form-data/form-data.d.ts
vendored
Normal file
25
typings/form-data/form-data.d.ts
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
// Type definitions for form-data
|
||||
// Project: https://github.com/felixge/node-form-data
|
||||
// Definitions by: Carlos Ballesteros Velasco <https://github.com/soywiz>, Leon Yu <https://github.com/leonyu>
|
||||
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
||||
|
||||
// Imported from: https://github.com/soywiz/typescript-node-definitions/form-data.d.ts
|
||||
|
||||
declare module "form-data" {
|
||||
class FormData {
|
||||
append(key: string, value: any, options?: any): void;
|
||||
getHeaders(): FormData.Dictionary<string>;
|
||||
// TODO expand pipe
|
||||
pipe(to: any): any;
|
||||
submit(params: string | Object, callback: (error: any, response: any) => void): any;
|
||||
getBoundary(): string;
|
||||
}
|
||||
|
||||
namespace FormData {
|
||||
interface Dictionary<T> {
|
||||
[key: string]: T;
|
||||
}
|
||||
}
|
||||
|
||||
export = FormData;
|
||||
}
|
||||
20
typings/mime/mime.d.ts
vendored
Normal file
20
typings/mime/mime.d.ts
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
// Type definitions for mime
|
||||
// Project: https://github.com/broofa/node-mime
|
||||
// Definitions by: Jeff Goddard <https://github.com/jedigo>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
// Imported from: https://github.com/soywiz/typescript-node-definitions/mime.d.ts
|
||||
|
||||
declare module "mime" {
|
||||
export function lookup(path: string): string;
|
||||
export function extension(mime: string): string;
|
||||
export function load(filepath: string): void;
|
||||
export function define(mimes: Object): void;
|
||||
|
||||
interface Charsets {
|
||||
lookup(mime: string): string;
|
||||
}
|
||||
|
||||
export var charsets: Charsets;
|
||||
export var default_type: string;
|
||||
}
|
||||
3949
typings/node/node.d.ts
vendored
Normal file
3949
typings/node/node.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
55
typings/onoff/onoff.d.ts
vendored
Normal file
55
typings/onoff/onoff.d.ts
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
// Type definitions for onoff
|
||||
// Project: https://github.com/fivdi/onoff
|
||||
// Definitions by: Marcel Ernst <https://github.com/marcel-ernst>
|
||||
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
||||
|
||||
/// <reference path="../node/node.d.ts" />
|
||||
|
||||
declare namespace __ONOFF {
|
||||
|
||||
var version:string;
|
||||
|
||||
interface GpioOptions {
|
||||
debounceTimeout:number;
|
||||
}
|
||||
|
||||
class Gpio {
|
||||
constructor(gpio:number, direction:string);
|
||||
constructor(gpio:number, direction:string, edge:string);
|
||||
constructor(gpio:number, direction:string, edge:string, options:GpioOptions);
|
||||
constructor(gpio:number, direction:string, options:GpioOptions);
|
||||
|
||||
gpio:number
|
||||
gpioPath:string;
|
||||
opts:GpioOptions;
|
||||
readBuffer:Buffer;
|
||||
listeners:Array<(error:Error, value:number) => void>;
|
||||
valueFd:number;
|
||||
|
||||
read(cb:(err:Error, value:number) => void):void;
|
||||
readSync():number;
|
||||
|
||||
write(value:number, cb:(err:Error, value:number) => void):void;
|
||||
writeSync(value:number):void;
|
||||
|
||||
watch(cb:(error:Error, value:number) => void):void;
|
||||
unwatch():void;
|
||||
unwatch(cb:(error:Error, value:number) => void):void;
|
||||
unwatchAll():void;
|
||||
|
||||
direction():string;
|
||||
setDirection(value:string):void;
|
||||
|
||||
edge():string;
|
||||
setEdge(value:string):void;
|
||||
|
||||
options():GpioOptions;
|
||||
|
||||
unexport():void;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
declare module "onoff" {
|
||||
export = __ONOFF;
|
||||
}
|
||||
262
typings/request/request.d.ts
vendored
Normal file
262
typings/request/request.d.ts
vendored
Normal file
@@ -0,0 +1,262 @@
|
||||
// Type definitions for request
|
||||
// Project: https://github.com/request/request
|
||||
// Definitions by: Carlos Ballesteros Velasco <https://github.com/soywiz>, bonnici <https://github.com/bonnici>, Bart van der Schoor <https://github.com/Bartvds>, Joe Skeen <http://github.com/joeskeen>, Christopher Currens <https://github.com/ccurrens>
|
||||
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
||||
|
||||
// Imported from: https://github.com/soywiz/typescript-node-definitions/d.ts
|
||||
|
||||
/// <reference path="../node/node.d.ts" />
|
||||
/// <reference path="../form-data/form-data.d.ts" />
|
||||
|
||||
declare module 'request' {
|
||||
import stream = require('stream');
|
||||
import http = require('http');
|
||||
import https = require('https');
|
||||
import url = require('url');
|
||||
import fs = require('fs');
|
||||
import FormData = require('form-data');
|
||||
|
||||
namespace request {
|
||||
export interface RequestAPI<TRequest extends Request,
|
||||
TOptions extends CoreOptions,
|
||||
TUriUrlOptions> {
|
||||
|
||||
defaults(options: TOptions): RequestAPI<TRequest, TOptions, RequiredUriUrl>;
|
||||
defaults(options: RequiredUriUrl & TOptions): DefaultUriUrlRequestApi<TRequest, TOptions, OptionalUriUrl>;
|
||||
|
||||
(uri: string, options?: TOptions, callback?: RequestCallback): TRequest;
|
||||
(uri: string, callback?: RequestCallback): TRequest;
|
||||
(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest;
|
||||
|
||||
get(uri: string, options?: TOptions, callback?: RequestCallback): TRequest;
|
||||
get(uri: string, callback?: RequestCallback): TRequest;
|
||||
get(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest;
|
||||
|
||||
post(uri: string, options?: TOptions, callback?: RequestCallback): TRequest;
|
||||
post(uri: string, callback?: RequestCallback): TRequest;
|
||||
post(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest;
|
||||
|
||||
put(uri: string, options?: TOptions, callback?: RequestCallback): TRequest;
|
||||
put(uri: string, callback?: RequestCallback): TRequest;
|
||||
put(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest;
|
||||
|
||||
head(uri: string, options?: TOptions, callback?: RequestCallback): TRequest;
|
||||
head(uri: string, callback?: RequestCallback): TRequest;
|
||||
head(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest;
|
||||
|
||||
patch(uri: string, options?: TOptions, callback?: RequestCallback): TRequest;
|
||||
patch(uri: string, callback?: RequestCallback): TRequest;
|
||||
patch(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest;
|
||||
|
||||
del(uri: string, options?: TOptions, callback?: RequestCallback): TRequest;
|
||||
del(uri: string, callback?: RequestCallback): TRequest;
|
||||
del(options: TUriUrlOptions & TOptions, callback?: RequestCallback): TRequest;
|
||||
|
||||
forever(agentOptions: any, optionsArg: any): TRequest;
|
||||
jar(): CookieJar;
|
||||
cookie(str: string): Cookie;
|
||||
|
||||
initParams: any;
|
||||
debug: boolean;
|
||||
}
|
||||
|
||||
interface DefaultUriUrlRequestApi<TRequest extends Request,
|
||||
TOptions extends CoreOptions,
|
||||
TUriUrlOptions> extends RequestAPI<TRequest, TOptions, TUriUrlOptions> {
|
||||
|
||||
defaults(options: TOptions): DefaultUriUrlRequestApi<TRequest, TOptions, OptionalUriUrl>;
|
||||
(): TRequest;
|
||||
get(): TRequest;
|
||||
post(): TRequest;
|
||||
put(): TRequest;
|
||||
head(): TRequest;
|
||||
patch(): TRequest;
|
||||
del(): TRequest;
|
||||
}
|
||||
|
||||
interface CoreOptions {
|
||||
baseUrl?: string;
|
||||
callback?: (error: any, response: http.IncomingMessage, body: any) => void;
|
||||
jar?: any; // CookieJar
|
||||
formData?: any; // Object
|
||||
form?: any; // Object or string
|
||||
auth?: AuthOptions;
|
||||
oauth?: OAuthOptions;
|
||||
aws?: AWSOptions;
|
||||
hawk?: HawkOptions;
|
||||
qs?: any;
|
||||
json?: any;
|
||||
multipart?: RequestPart[] | Multipart;
|
||||
agent?: http.Agent | https.Agent;
|
||||
agentOptions?: any;
|
||||
agentClass?: any;
|
||||
forever?: any;
|
||||
host?: string;
|
||||
port?: number;
|
||||
method?: string;
|
||||
headers?: Headers;
|
||||
body?: any;
|
||||
followRedirect?: boolean | ((response: http.IncomingMessage) => boolean);
|
||||
followAllRedirects?: boolean;
|
||||
maxRedirects?: number;
|
||||
encoding?: string;
|
||||
pool?: any;
|
||||
timeout?: number;
|
||||
proxy?: any;
|
||||
strictSSL?: boolean;
|
||||
gzip?: boolean;
|
||||
preambleCRLF?: boolean;
|
||||
postambleCRLF?: boolean;
|
||||
key?: Buffer;
|
||||
cert?: Buffer;
|
||||
passphrase?: string;
|
||||
ca?: string | Buffer | string[] | Buffer[];
|
||||
har?: HttpArchiveRequest;
|
||||
useQuerystring?: boolean;
|
||||
}
|
||||
|
||||
interface UriOptions {
|
||||
uri: string;
|
||||
}
|
||||
interface UrlOptions {
|
||||
url: string;
|
||||
}
|
||||
export type RequiredUriUrl = UriOptions | UrlOptions;
|
||||
|
||||
interface OptionalUriUrl {
|
||||
uri?: string;
|
||||
url?: string;
|
||||
}
|
||||
|
||||
export type OptionsWithUri = UriOptions & CoreOptions;
|
||||
export type OptionsWithUrl = UrlOptions & CoreOptions;
|
||||
export type Options = OptionsWithUri | OptionsWithUrl;
|
||||
|
||||
export interface RequestCallback {
|
||||
(error: any, response: http.IncomingMessage, body: any): void;
|
||||
}
|
||||
|
||||
export interface HttpArchiveRequest {
|
||||
url?: string;
|
||||
method?: string;
|
||||
headers?: NameValuePair[];
|
||||
postData?: {
|
||||
mimeType?: string;
|
||||
params?: NameValuePair[];
|
||||
}
|
||||
}
|
||||
|
||||
export interface NameValuePair {
|
||||
name: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export interface Multipart {
|
||||
chunked?: boolean;
|
||||
data?: {
|
||||
'content-type'?: string,
|
||||
body: string
|
||||
}[];
|
||||
}
|
||||
|
||||
export interface RequestPart {
|
||||
headers?: Headers;
|
||||
body: any;
|
||||
}
|
||||
|
||||
export interface Request extends stream.Stream {
|
||||
readable: boolean;
|
||||
writable: boolean;
|
||||
|
||||
getAgent(): http.Agent;
|
||||
//start(): void;
|
||||
//abort(): void;
|
||||
pipeDest(dest: any): void;
|
||||
setHeader(name: string, value: string, clobber?: boolean): Request;
|
||||
setHeaders(headers: Headers): Request;
|
||||
qs(q: Object, clobber?: boolean): Request;
|
||||
form(): FormData;
|
||||
form(form: any): Request;
|
||||
multipart(multipart: RequestPart[]): Request;
|
||||
json(val: any): Request;
|
||||
aws(opts: AWSOptions, now?: boolean): Request;
|
||||
auth(username: string, password: string, sendInmediately?: boolean, bearer?: string): Request;
|
||||
oauth(oauth: OAuthOptions): Request;
|
||||
jar(jar: CookieJar): Request;
|
||||
|
||||
on(event: string, listener: Function): this;
|
||||
on(event: 'request', listener: (req: http.ClientRequest) => void): this;
|
||||
on(event: 'response', listener: (resp: http.IncomingMessage) => void): this;
|
||||
on(event: 'data', listener: (data: Buffer | string) => void): this;
|
||||
on(event: 'error', listener: (e: Error) => void): this;
|
||||
on(event: 'complete', listener: (resp: http.IncomingMessage, body?: string | Buffer) => void): this;
|
||||
|
||||
write(buffer: Buffer, cb?: Function): boolean;
|
||||
write(str: string, cb?: Function): boolean;
|
||||
write(str: string, encoding: string, cb?: Function): boolean;
|
||||
write(str: string, encoding?: string, fd?: string): boolean;
|
||||
end(): void;
|
||||
end(chunk: Buffer, cb?: Function): void;
|
||||
end(chunk: string, cb?: Function): void;
|
||||
end(chunk: string, encoding: string, cb?: Function): void;
|
||||
pause(): void;
|
||||
resume(): void;
|
||||
abort(): void;
|
||||
destroy(): void;
|
||||
toJSON(): Object;
|
||||
}
|
||||
|
||||
export interface Headers {
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
export interface AuthOptions {
|
||||
user?: string;
|
||||
username?: string;
|
||||
pass?: string;
|
||||
password?: string;
|
||||
sendImmediately?: boolean;
|
||||
bearer?: string;
|
||||
}
|
||||
|
||||
export interface OAuthOptions {
|
||||
callback?: string;
|
||||
consumer_key?: string;
|
||||
consumer_secret?: string;
|
||||
token?: string;
|
||||
token_secret?: string;
|
||||
verifier?: string;
|
||||
}
|
||||
|
||||
export interface HawkOptions {
|
||||
credentials: any;
|
||||
}
|
||||
|
||||
export interface AWSOptions {
|
||||
secret: string;
|
||||
bucket?: string;
|
||||
}
|
||||
|
||||
export interface CookieJar {
|
||||
setCookie(cookie: Cookie, uri: string | url.Url, options?: any): void
|
||||
getCookieString(uri: string | url.Url): string
|
||||
getCookies(uri: string | url.Url): Cookie[]
|
||||
}
|
||||
|
||||
export interface CookieValue {
|
||||
name: string;
|
||||
value: any;
|
||||
httpOnly: boolean;
|
||||
}
|
||||
|
||||
export interface Cookie extends Array<CookieValue> {
|
||||
constructor(name: string, req: Request): void;
|
||||
str: string;
|
||||
expires: Date;
|
||||
path: string;
|
||||
toString(): string;
|
||||
}
|
||||
}
|
||||
var request: request.RequestAPI<request.Request, request.CoreOptions, request.RequiredUriUrl>;
|
||||
export = request;
|
||||
}
|
||||
86
typings/serve-static/serve-static.d.ts
vendored
Normal file
86
typings/serve-static/serve-static.d.ts
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
// Type definitions for serve-static 1.7.1
|
||||
// Project: https://github.com/expressjs/serve-static
|
||||
// Definitions by: Uros Smolnik <https://github.com/urossmolnik/>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
/* =================== USAGE ===================
|
||||
|
||||
import * as serveStatic from "serve-static";
|
||||
app.use(serveStatic("public/ftp", {"index": ["default.html", "default.htm"]}))
|
||||
|
||||
=============================================== */
|
||||
|
||||
/// <reference path="../express/express.d.ts" />
|
||||
/// <reference path="../mime/mime.d.ts" />
|
||||
|
||||
declare module "serve-static" {
|
||||
import * as express from "express";
|
||||
|
||||
/**
|
||||
* Create a new middleware function to serve files from within a given root directory.
|
||||
* The file to serve will be determined by combining req.url with the provided root directory.
|
||||
* When a file is not found, instead of sending a 404 response, this module will instead call next() to move on to the next middleware, allowing for stacking and fall-backs.
|
||||
*/
|
||||
function serveStatic(root: string, options?: {
|
||||
/**
|
||||
* Set how "dotfiles" are treated when encountered. A dotfile is a file or directory that begins with a dot (".").
|
||||
* Note this check is done on the path itself without checking if the path actually exists on the disk.
|
||||
* If root is specified, only the dotfiles above the root are checked (i.e. the root itself can be within a dotfile when when set to "deny").
|
||||
* The default value is 'ignore'.
|
||||
* 'allow' No special treatment for dotfiles
|
||||
* 'deny' Send a 403 for any request for a dotfile
|
||||
* 'ignore' Pretend like the dotfile does not exist and call next()
|
||||
*/
|
||||
dotfiles?: string;
|
||||
|
||||
/**
|
||||
* Enable or disable etag generation, defaults to true.
|
||||
*/
|
||||
etag?: boolean;
|
||||
|
||||
/**
|
||||
* Set file extension fallbacks. When set, if a file is not found, the given extensions will be added to the file name and search for.
|
||||
* The first that exists will be served. Example: ['html', 'htm'].
|
||||
* The default value is false.
|
||||
*/
|
||||
extensions?: string[];
|
||||
|
||||
/**
|
||||
* By default this module will send "index.html" files in response to a request on a directory.
|
||||
* To disable this set false or to supply a new index pass a string or an array in preferred order.
|
||||
*/
|
||||
index?: boolean|string|string[];
|
||||
|
||||
/**
|
||||
* Enable or disable Last-Modified header, defaults to true. Uses the file system's last modified value.
|
||||
*/
|
||||
lastModified?: boolean;
|
||||
|
||||
/**
|
||||
* Provide a max-age in milliseconds for http caching, defaults to 0. This can also be a string accepted by the ms module.
|
||||
*/
|
||||
maxAge?: number|string;
|
||||
|
||||
/**
|
||||
* Redirect to trailing "/" when the pathname is a dir. Defaults to true.
|
||||
*/
|
||||
redirect?: boolean;
|
||||
|
||||
/**
|
||||
* Function to set custom headers on response. Alterations to the headers need to occur synchronously.
|
||||
* The function is called as fn(res, path, stat), where the arguments are:
|
||||
* res the response object
|
||||
* path the file path that is being sent
|
||||
* stat the stat object of the file that is being sent
|
||||
*/
|
||||
setHeaders?: (res: express.Response, path: string, stat: any) => any;
|
||||
}): express.Handler;
|
||||
|
||||
import * as m from "mime";
|
||||
|
||||
module serveStatic {
|
||||
var mime: typeof m;
|
||||
}
|
||||
|
||||
export = serveStatic;
|
||||
}
|
||||
857
typings/socket.io/socket.io.d.ts
vendored
Normal file
857
typings/socket.io/socket.io.d.ts
vendored
Normal file
@@ -0,0 +1,857 @@
|
||||
// Type definitions for socket.io 1.4.4
|
||||
// Project: http://socket.io/
|
||||
// Definitions by: PROGRE <https://github.com/progre/>, Damian Connolly <https://github.com/divillysausages/>, Florent Poujol <https://github.com/florentpoujol/>
|
||||
// Definitions: https://github.com/borisyankov/DefinitelyTyped
|
||||
|
||||
///<reference path='../node/node.d.ts' />
|
||||
|
||||
declare module 'socket.io' {
|
||||
var server: SocketIOStatic;
|
||||
|
||||
export = server;
|
||||
}
|
||||
|
||||
interface SocketIOStatic {
|
||||
/**
|
||||
* Default Server constructor
|
||||
*/
|
||||
(): SocketIO.Server;
|
||||
|
||||
/**
|
||||
* Creates a new Server
|
||||
* @param srv The HTTP server that we're going to bind to
|
||||
* @param opts An optional parameters object
|
||||
*/
|
||||
(srv: any, opts?: SocketIO.ServerOptions): SocketIO.Server;
|
||||
|
||||
/**
|
||||
* Creates a new Server
|
||||
* @param port A port to bind to, as a number, or a string
|
||||
* @param An optional parameters object
|
||||
*/
|
||||
(port: string|number, opts?: SocketIO.ServerOptions): SocketIO.Server;
|
||||
|
||||
/**
|
||||
* Creates a new Server
|
||||
* @param A parameters object
|
||||
*/
|
||||
(opts: SocketIO.ServerOptions): SocketIO.Server;
|
||||
|
||||
/**
|
||||
* Backwards compatibility
|
||||
* @see io().listen()
|
||||
*/
|
||||
listen: SocketIOStatic;
|
||||
}
|
||||
|
||||
declare module SocketIO {
|
||||
|
||||
interface Server {
|
||||
|
||||
/**
|
||||
* A dictionary of all the namespaces currently on this Server
|
||||
*/
|
||||
nsps: {[namespace: string]: Namespace};
|
||||
|
||||
/**
|
||||
* The default '/' Namespace
|
||||
*/
|
||||
sockets: Namespace;
|
||||
|
||||
/**
|
||||
* Sets the 'json' flag when emitting an event
|
||||
*/
|
||||
json: Server;
|
||||
|
||||
/**
|
||||
* Server request verification function, that checks for allowed origins
|
||||
* @param req The http.IncomingMessage request
|
||||
* @param fn The callback to be called. It should take one parameter, err,
|
||||
* which will be null if there was no problem, and one parameter, success,
|
||||
* of type boolean
|
||||
*/
|
||||
checkRequest( req:any, fn:( err: any, success: boolean ) => void ):void;
|
||||
|
||||
/**
|
||||
* Gets whether we're serving the client.js file or not
|
||||
* @default true
|
||||
*/
|
||||
serveClient(): boolean;
|
||||
|
||||
/**
|
||||
* Sets whether we're serving the client.js file or not
|
||||
* @param v True if we want to serve the file, false otherwise
|
||||
* @default true
|
||||
* @return This Server
|
||||
*/
|
||||
serveClient( v: boolean ): Server;
|
||||
|
||||
/**
|
||||
* Gets the client serving path
|
||||
* @default '/socket.io'
|
||||
*/
|
||||
path(): string;
|
||||
|
||||
/**
|
||||
* Sets the client serving path
|
||||
* @param v The path to serve the client file on
|
||||
* @default '/socket.io'
|
||||
* @return This Server
|
||||
*/
|
||||
path( v: string ): Server;
|
||||
|
||||
/**
|
||||
* Gets the adapter that we're going to use for handling rooms
|
||||
* @default typeof Adapter
|
||||
*/
|
||||
adapter(): any;
|
||||
|
||||
/**
|
||||
* Sets the adapter (class) that we're going to use for handling rooms
|
||||
* @param v The class for the adapter to create
|
||||
* @default typeof Adapter
|
||||
* @return This Server
|
||||
*/
|
||||
adapter( v: any ): Server;
|
||||
|
||||
/**
|
||||
* Gets the allowed origins for requests
|
||||
* @default "*:*"
|
||||
*/
|
||||
origins(): string;
|
||||
|
||||
/**
|
||||
* Sets the allowed origins for requests
|
||||
* @param v The allowed origins, in host:port form
|
||||
* @default "*:*"
|
||||
* return This Server
|
||||
*/
|
||||
origins( v: string ): Server;
|
||||
|
||||
/**
|
||||
* Attaches socket.io to a server
|
||||
* @param srv The http.Server that we want to attach to
|
||||
* @param opts An optional parameters object
|
||||
* @return This Server
|
||||
*/
|
||||
attach( srv: any, opts?: ServerOptions ): Server;
|
||||
|
||||
/**
|
||||
* Attaches socket.io to a port
|
||||
* @param port The port that we want to attach to
|
||||
* @param opts An optional parameters object
|
||||
* @return This Server
|
||||
*/
|
||||
attach( port: number, opts?: ServerOptions ): Server;
|
||||
|
||||
/**
|
||||
* @see attach( srv, opts )
|
||||
*/
|
||||
listen( srv: any, opts?: ServerOptions ): Server;
|
||||
|
||||
/**
|
||||
* @see attach( port, opts )
|
||||
*/
|
||||
listen( port: number, opts?: ServerOptions ): Server;
|
||||
|
||||
/**
|
||||
* Binds socket.io to an engine.io intsance
|
||||
* @param src The Engine.io (or compatible) server to bind to
|
||||
* @return This Server
|
||||
*/
|
||||
bind( srv: any ): Server;
|
||||
|
||||
/**
|
||||
* Called with each incoming connection
|
||||
* @param socket The Engine.io Socket
|
||||
* @return This Server
|
||||
*/
|
||||
onconnection( socket: any ): Server;
|
||||
|
||||
/**
|
||||
* Looks up/creates a Namespace
|
||||
* @param nsp The name of the NameSpace to look up/create. Should start
|
||||
* with a '/'
|
||||
* @return The Namespace
|
||||
*/
|
||||
of( nsp: string ): Namespace;
|
||||
|
||||
/**
|
||||
* Closes the server connection
|
||||
*/
|
||||
close():void;
|
||||
|
||||
/**
|
||||
* The event fired when we get a new connection
|
||||
* @param event The event being fired: 'connection'
|
||||
* @param listener A listener that should take one parameter of type Socket
|
||||
* @return The default '/' Namespace
|
||||
*/
|
||||
on( event: 'connection', listener: ( socket: Socket ) => void ): Namespace;
|
||||
|
||||
/**
|
||||
* @see on( 'connection', listener )
|
||||
*/
|
||||
on( event: 'connect', listener: ( socket: Socket ) => void ): Namespace;
|
||||
|
||||
/**
|
||||
* Base 'on' method to add a listener for an event
|
||||
* @param event The event that we want to add a listener for
|
||||
* @param listener The callback to call when we get the event. The parameters
|
||||
* for the callback depend on the event
|
||||
* @return The default '/' Namespace
|
||||
*/
|
||||
on( event: string, listener: Function ): Namespace;
|
||||
|
||||
/**
|
||||
* Targets a room when emitting to the default '/' Namespace
|
||||
* @param room The name of the room that we're targeting
|
||||
* @return The default '/' Namespace
|
||||
*/
|
||||
to( room: string ): Namespace;
|
||||
|
||||
/**
|
||||
* @see to( room )
|
||||
*/
|
||||
in( room: string ): Namespace;
|
||||
|
||||
/**
|
||||
* Registers a middleware function, which is a function that gets executed
|
||||
* for every incoming Socket, on the default '/' Namespace
|
||||
* @param fn The function to call when we get a new incoming socket. It should
|
||||
* take one parameter of type Socket, and one callback function to call to
|
||||
* execute the next middleware function. The callback can take one optional
|
||||
* parameter, err, if there was an error. Errors passed to middleware callbacks
|
||||
* are sent as special 'error' packets to clients
|
||||
* @return The default '/' Namespace
|
||||
*/
|
||||
use( fn: ( socket:Socket, fn: ( err?: any ) => void ) =>void ): Namespace;
|
||||
|
||||
/**
|
||||
* Emits an event to the default Namespace
|
||||
* @param event The event that we want to emit
|
||||
* @param args Any number of optional arguments to pass with the event. If the
|
||||
* last argument is a function, it will be called as an ack. The ack should
|
||||
* take whatever data was sent with the packet
|
||||
* @return The default '/' Namespace
|
||||
*/
|
||||
emit( event: string, ...args: any[]): Namespace;
|
||||
|
||||
/**
|
||||
* Sends a 'message' event
|
||||
* @see emit( event, ...args )
|
||||
* @return The default '/' Namespace
|
||||
*/
|
||||
send( ...args: any[] ): Namespace;
|
||||
|
||||
/**
|
||||
* @see send( ...args )
|
||||
*/
|
||||
write( ...args: any[] ): Namespace;
|
||||
|
||||
/**
|
||||
* Gets a list of clients
|
||||
* @return The default '/' Namespace
|
||||
*/
|
||||
clients( ...args: any[] ): Namespace;
|
||||
|
||||
/**
|
||||
* Sets the compress flag
|
||||
* @return The default '/' Namespace
|
||||
*/
|
||||
compress( ...args: any[] ): Namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* Options to pass to our server when creating it
|
||||
*/
|
||||
interface ServerOptions {
|
||||
|
||||
/**
|
||||
* The path to server the client file to
|
||||
* @default '/socket.io'
|
||||
*/
|
||||
path?: string;
|
||||
|
||||
/**
|
||||
* Should we serve the client file?
|
||||
* @default true
|
||||
*/
|
||||
serveClient?: boolean;
|
||||
|
||||
/**
|
||||
* The adapter to use for handling rooms. NOTE: this should be a class,
|
||||
* not an object
|
||||
* @default typeof Adapter
|
||||
*/
|
||||
adapter?: Adapter;
|
||||
|
||||
/**
|
||||
* Accepted origins
|
||||
* @default '*:*'
|
||||
*/
|
||||
origins?: string;
|
||||
|
||||
/**
|
||||
* How many milliseconds without a pong packed to consider the connection closed (engine.io)
|
||||
* @default 60000
|
||||
*/
|
||||
pingTimeout?: number;
|
||||
|
||||
/**
|
||||
* How many milliseconds before sending a new ping packet (keep-alive) (engine.io)
|
||||
* @default 25000
|
||||
*/
|
||||
pingInterval?: number;
|
||||
|
||||
/**
|
||||
* How many bytes or characters a message can be when polling, before closing the session
|
||||
* (to avoid Dos) (engine.io)
|
||||
* @default 10E7
|
||||
*/
|
||||
maxHttpBufferSize?: number;
|
||||
|
||||
/**
|
||||
* A function that receives a given handshake or upgrade request as its first parameter,
|
||||
* and can decide whether to continue or not. The second argument is a function that needs
|
||||
* to be called with the decided information: fn( err, success ), where success is a boolean
|
||||
* value where false means that the request is rejected, and err is an error code (engine.io)
|
||||
* @default null
|
||||
*/
|
||||
allowRequest?: (request:any, callback: (err: number, success: boolean) => void) => void;
|
||||
|
||||
/**
|
||||
* Transports to allow connections to (engine.io)
|
||||
* @default ['polling','websocket']
|
||||
*/
|
||||
transports?: string[];
|
||||
|
||||
/**
|
||||
* Whether to allow transport upgrades (engine.io)
|
||||
* @default true
|
||||
*/
|
||||
allowUpgrades?: boolean;
|
||||
|
||||
/**
|
||||
* parameters of the WebSocket permessage-deflate extension (see ws module).
|
||||
* Set to false to disable (engine.io)
|
||||
* @default true
|
||||
*/
|
||||
perMessageDeflate?: Object|boolean;
|
||||
|
||||
/**
|
||||
* Parameters of the http compression for the polling transports (see zlib).
|
||||
* Set to false to disable, or set an object with parameter "threshold:number"
|
||||
* to only compress data if the byte size is above this value (1024) (engine.io)
|
||||
* @default true|1024
|
||||
*/
|
||||
httpCompression?: Object|boolean;
|
||||
|
||||
/**
|
||||
* Name of the HTTP cookie that contains the client sid to send as part of
|
||||
* handshake response headers. Set to false to not send one (engine.io)
|
||||
* @default "io"
|
||||
*/
|
||||
cookie?: string|boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* The Namespace, sandboxed environments for sockets, each connection
|
||||
* to a Namespace requires a new Socket
|
||||
*/
|
||||
interface Namespace extends NodeJS.EventEmitter {
|
||||
|
||||
/**
|
||||
* The name of the NameSpace
|
||||
*/
|
||||
name: string;
|
||||
|
||||
/**
|
||||
* The controller Server for this Namespace
|
||||
*/
|
||||
server: Server;
|
||||
|
||||
/**
|
||||
* A dictionary of all the Sockets connected to this Namespace, where
|
||||
* the Socket ID is the key
|
||||
*/
|
||||
sockets: { [id: string]: Socket };
|
||||
|
||||
/**
|
||||
* A dictionary of all the Sockets connected to this Namespace, where
|
||||
* the Socket ID is the key
|
||||
*/
|
||||
connected: { [id: string]: Socket };
|
||||
|
||||
/**
|
||||
* The Adapter that we're using to handle dealing with rooms etc
|
||||
*/
|
||||
adapter: Adapter;
|
||||
|
||||
/**
|
||||
* Sets the 'json' flag when emitting an event
|
||||
*/
|
||||
json: Namespace;
|
||||
|
||||
/**
|
||||
* Registers a middleware function, which is a function that gets executed
|
||||
* for every incoming Socket
|
||||
* @param fn The function to call when we get a new incoming socket. It should
|
||||
* take one parameter of type Socket, and one callback function to call to
|
||||
* execute the next middleware function. The callback can take one optional
|
||||
* parameter, err, if there was an error. Errors passed to middleware callbacks
|
||||
* are sent as special 'error' packets to clients
|
||||
* @return This Namespace
|
||||
*/
|
||||
use( fn: ( socket:Socket, fn: ( err?: any ) => void ) =>void ): Namespace;
|
||||
|
||||
/**
|
||||
* Targets a room when emitting
|
||||
* @param room The name of the room that we're targeting
|
||||
* @return This Namespace
|
||||
*/
|
||||
to( room: string ): Namespace;
|
||||
|
||||
/**
|
||||
* @see to( room )
|
||||
*/
|
||||
in( room: string ): Namespace;
|
||||
|
||||
/**
|
||||
* Sends a 'message' event
|
||||
* @see emit( event, ...args )
|
||||
* @return This Namespace
|
||||
*/
|
||||
send( ...args: any[] ): Namespace;
|
||||
|
||||
/**
|
||||
* @see send( ...args )
|
||||
*/
|
||||
write( ...args: any[] ): Namespace;
|
||||
|
||||
/**
|
||||
* The event fired when we get a new connection
|
||||
* @param event The event being fired: 'connection'
|
||||
* @param listener A listener that should take one parameter of type Socket
|
||||
* @return This Namespace
|
||||
*/
|
||||
on( event: 'connection', listener: ( socket: Socket ) => void ): any;
|
||||
|
||||
/**
|
||||
* @see on( 'connection', listener )
|
||||
*/
|
||||
on( event: 'connect', listener: ( socket: Socket ) => void ): any;
|
||||
|
||||
/**
|
||||
* Base 'on' method to add a listener for an event
|
||||
* @param event The event that we want to add a listener for
|
||||
* @param listener The callback to call when we get the event. The parameters
|
||||
* for the callback depend on the event
|
||||
* @ This Namespace
|
||||
*/
|
||||
on( event: string, listener: Function ): any;
|
||||
|
||||
/**
|
||||
* Gets a list of clients.
|
||||
* @return This Namespace
|
||||
*/
|
||||
clients( fn: Function ): Namespace;
|
||||
|
||||
/**
|
||||
* Sets the compress flag.
|
||||
* @param compress If `true`, compresses the sending data
|
||||
* @return This Namespace
|
||||
*/
|
||||
compress( compress: boolean ): Namespace;
|
||||
}
|
||||
|
||||
/**
|
||||
* The socket, which handles our connection for a namespace. NOTE: while
|
||||
* we technically extend NodeJS.EventEmitter, we're not putting it here
|
||||
* as we have a problem with the emit() event (as it's overridden with a
|
||||
* different return)
|
||||
*/
|
||||
interface Socket {
|
||||
|
||||
/**
|
||||
* The namespace that this socket is for
|
||||
*/
|
||||
nsp: Namespace;
|
||||
|
||||
/**
|
||||
* The Server that our namespace is in
|
||||
*/
|
||||
server: Server;
|
||||
|
||||
/**
|
||||
* The Adapter that we use to handle our rooms
|
||||
*/
|
||||
adapter: Adapter;
|
||||
|
||||
/**
|
||||
* The unique ID for this Socket. Regenerated at every connection. This is
|
||||
* also the name of the room that the Socket automatically joins on connection
|
||||
*/
|
||||
id: string;
|
||||
|
||||
/**
|
||||
* The http.IncomingMessage request sent with the connection. Useful
|
||||
* for recovering headers etc
|
||||
*/
|
||||
request: any;
|
||||
|
||||
/**
|
||||
* The Client associated with this Socket
|
||||
*/
|
||||
client: Client;
|
||||
|
||||
/**
|
||||
* The underlying Engine.io Socket instance
|
||||
*/
|
||||
conn: {
|
||||
|
||||
/**
|
||||
* The ID for this socket - matches Client.id
|
||||
*/
|
||||
id: string;
|
||||
|
||||
/**
|
||||
* The Engine.io Server for this socket
|
||||
*/
|
||||
server: any;
|
||||
|
||||
/**
|
||||
* The ready state for the client. Either 'opening', 'open', 'closing', or 'closed'
|
||||
*/
|
||||
readyState: string;
|
||||
|
||||
/**
|
||||
* The remote IP for this connection
|
||||
*/
|
||||
remoteAddress: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* The list of rooms that this Socket is currently in, where
|
||||
* the ID the the room ID
|
||||
*/
|
||||
rooms: { [id: string]: string };
|
||||
|
||||
/**
|
||||
* Is the Socket currently connected?
|
||||
*/
|
||||
connected: boolean;
|
||||
|
||||
/**
|
||||
* Is the Socket currently disconnected?
|
||||
*/
|
||||
disconnected: boolean;
|
||||
|
||||
/**
|
||||
* The object used when negociating the handshake
|
||||
*/
|
||||
handshake: {
|
||||
/**
|
||||
* The headers passed along with the request. e.g. 'host',
|
||||
* 'connection', 'accept', 'referer', 'cookie'
|
||||
*/
|
||||
headers: any;
|
||||
|
||||
/**
|
||||
* The current time, as a string
|
||||
*/
|
||||
time: string;
|
||||
|
||||
/**
|
||||
* The remote address of the connection request
|
||||
*/
|
||||
address: string;
|
||||
|
||||
/**
|
||||
* Is this a cross-domain request?
|
||||
*/
|
||||
xdomain: boolean;
|
||||
|
||||
/**
|
||||
* Is this a secure request?
|
||||
*/
|
||||
secure: boolean;
|
||||
|
||||
/**
|
||||
* The timestamp for when this was issued
|
||||
*/
|
||||
issued: number;
|
||||
|
||||
/**
|
||||
* The request url
|
||||
*/
|
||||
url: string;
|
||||
|
||||
/**
|
||||
* Any query string parameters in the request url
|
||||
*/
|
||||
query: any;
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the 'json' flag when emitting an event
|
||||
*/
|
||||
json: Socket;
|
||||
|
||||
/**
|
||||
* Sets the 'volatile' flag when emitting an event. Volatile messages are
|
||||
* messages that can be dropped because of network issues and the like. Use
|
||||
* for high-volume/real-time messages where you don't need to receive *all*
|
||||
* of them
|
||||
*/
|
||||
volatile: Socket;
|
||||
|
||||
/**
|
||||
* Sets the 'broadcast' flag when emitting an event. Broadcasting an event
|
||||
* will send it to all the other sockets in the namespace except for yourself
|
||||
*/
|
||||
broadcast: Socket;
|
||||
|
||||
/**
|
||||
* Emits an event to this client. If the 'broadcast' flag was set, this will
|
||||
* emit to all other clients, except for this one
|
||||
* @param event The event that we want to emit
|
||||
* @param args Any number of optional arguments to pass with the event. If the
|
||||
* last argument is a function, it will be called as an ack. The ack should
|
||||
* take whatever data was sent with the packet
|
||||
* @return This Socket
|
||||
*/
|
||||
emit( event: string, ...args: any[]): Socket;
|
||||
|
||||
/**
|
||||
* Targets a room when broadcasting
|
||||
* @param room The name of the room that we're targeting
|
||||
* @return This Socket
|
||||
*/
|
||||
to( room: string ): Socket;
|
||||
|
||||
/**
|
||||
* @see to( room )
|
||||
*/
|
||||
in( room: string ): Socket;
|
||||
|
||||
/**
|
||||
* Sends a 'message' event
|
||||
* @see emit( event, ...args )
|
||||
*/
|
||||
send( ...args: any[] ): Socket;
|
||||
|
||||
/**
|
||||
* @see send( ...args )
|
||||
*/
|
||||
write( ...args: any[] ): Socket;
|
||||
|
||||
/**
|
||||
* Joins a room. You can join multiple rooms, and by default, on connection,
|
||||
* you join a room with the same name as your ID
|
||||
* @param name The name of the room that we want to join
|
||||
* @param fn An optional callback to call when we've joined the room. It should
|
||||
* take an optional parameter, err, of a possible error
|
||||
* @return This Socket
|
||||
*/
|
||||
join( name: string, fn?: ( err?: any ) => void ): Socket;
|
||||
|
||||
/**
|
||||
* Leaves a room
|
||||
* @param name The name of the room to leave
|
||||
* @param fn An optional callback to call when we've left the room. It should
|
||||
* take on optional parameter, err, of a possible error
|
||||
*/
|
||||
leave( name: string, fn?: Function ): Socket;
|
||||
|
||||
/**
|
||||
* Leaves all the rooms that we've joined
|
||||
*/
|
||||
leaveAll(): void;
|
||||
|
||||
/**
|
||||
* Disconnects this Socket
|
||||
* @param close If true, also closes the underlying connection
|
||||
* @return This Socket
|
||||
*/
|
||||
disconnect( close?: boolean ): Socket;
|
||||
|
||||
/**
|
||||
* Adds a listener for a particular event. Calling multiple times will add
|
||||
* multiple listeners
|
||||
* @param event The event that we're listening for
|
||||
* @param fn The function to call when we get the event. Parameters depend on the
|
||||
* event in question
|
||||
* @return This Socket
|
||||
*/
|
||||
on( event: string, fn: Function ): Socket;
|
||||
|
||||
/**
|
||||
* @see on( event, fn )
|
||||
*/
|
||||
addListener( event: string, fn: Function ): Socket;
|
||||
|
||||
/**
|
||||
* Adds a listener for a particular event that will be invoked
|
||||
* a single time before being automatically removed
|
||||
* @param event The event that we're listening for
|
||||
* @param fn The function to call when we get the event. Parameters depend on
|
||||
* the event in question
|
||||
* @return This Socket
|
||||
*/
|
||||
once( event: string, fn: Function ): Socket;
|
||||
|
||||
/**
|
||||
* Removes a listener for a particular type of event. This will either
|
||||
* remove a specific listener, or all listeners for this type of event
|
||||
* @param event The event that we want to remove the listener of
|
||||
* @param fn The function to remove, or null if we want to remove all functions
|
||||
* @return This Socket
|
||||
*/
|
||||
removeListener( event: string, fn?: Function ): Socket;
|
||||
|
||||
/**
|
||||
* Removes all event listeners on this object
|
||||
* @return This Socket
|
||||
*/
|
||||
removeAllListeners( event?: string ): Socket;
|
||||
|
||||
/**
|
||||
* Sets the maximum number of listeners this instance can have
|
||||
* @param n The max number of listeners we can add to this emitter
|
||||
* @return This Socket
|
||||
*/
|
||||
setMaxListeners( n: number ): Socket;
|
||||
|
||||
/**
|
||||
* Returns all the callbacks for a particular event
|
||||
* @param event The event that we're looking for the callbacks of
|
||||
* @return An array of callback Functions, or an empty array if we don't have any
|
||||
*/
|
||||
listeners( event: string ):Function[];
|
||||
|
||||
/**
|
||||
* Sets the compress flag
|
||||
* @param compress If `true`, compresses the sending data
|
||||
* @return This Socket
|
||||
*/
|
||||
compress( compress: boolean ): Socket;
|
||||
}
|
||||
|
||||
/**
|
||||
* The interface used when dealing with rooms etc
|
||||
*/
|
||||
interface Adapter extends NodeJS.EventEmitter {
|
||||
|
||||
/**
|
||||
* The namespace that this adapter is for
|
||||
*/
|
||||
nsp: Namespace;
|
||||
|
||||
/**
|
||||
* A dictionary of all the rooms that we have in this namespace
|
||||
* The rooms are made of a `sockets` key which is the dictionary of sockets per ID
|
||||
*/
|
||||
rooms: {[room: string]: {sockets: {[id: string]: boolean }}};
|
||||
|
||||
/**
|
||||
* A dictionary of all the socket ids that we're dealing with, and all
|
||||
* the rooms that the socket is currently in
|
||||
*/
|
||||
sids: {[id: string]: {[room: string]: boolean}};
|
||||
|
||||
/**
|
||||
* Adds a socket to a room. If the room doesn't exist, it's created
|
||||
* @param id The ID of the socket to add
|
||||
* @param room The name of the room to add the socket to
|
||||
* @param callback An optional callback to call when the socket has been
|
||||
* added. It should take an optional parameter, error, if there was a problem
|
||||
*/
|
||||
add( id: string, room: string, callback?: ( err?: any ) => void ): void;
|
||||
|
||||
/**
|
||||
* Removes a socket from a room. If there are no more sockets in the room,
|
||||
* the room is deleted
|
||||
* @param id The ID of the socket that we're removing
|
||||
* @param room The name of the room to remove the socket from
|
||||
* @param callback An optional callback to call when the socket has been
|
||||
* removed. It should take on optional parameter, error, if there was a problem
|
||||
*/
|
||||
del( id: string, room: string, callback?: ( err?: any ) => void ): void;
|
||||
|
||||
/**
|
||||
* Removes a socket from all the rooms that it's joined
|
||||
* @param id The ID of the socket that we're removing
|
||||
*/
|
||||
delAll( id: string ):void;
|
||||
|
||||
/**
|
||||
* Broadcasts a packet
|
||||
* @param packet The packet to broadcast
|
||||
* @param opts Any options to send along:
|
||||
* - rooms: An optional list of rooms to broadcast to. If empty, the packet is broadcast to all sockets
|
||||
* - except: A list of Socket IDs to exclude
|
||||
* - flags: Any flags that we want to send along ('json', 'volatile', 'broadcast')
|
||||
*/
|
||||
broadcast( packet: any, opts: { rooms?: string[]; except?: string[]; flags?: {[flag: string]: boolean} } ):void;
|
||||
}
|
||||
|
||||
/**
|
||||
* The client behind each socket (can have multiple sockets)
|
||||
*/
|
||||
interface Client {
|
||||
/**
|
||||
* The Server that this client belongs to
|
||||
*/
|
||||
server: Server;
|
||||
|
||||
/**
|
||||
* The underlying Engine.io Socket instance
|
||||
*/
|
||||
conn: {
|
||||
|
||||
/**
|
||||
* The ID for this socket - matches Client.id
|
||||
*/
|
||||
id: string;
|
||||
|
||||
/**
|
||||
* The Engine.io Server for this socket
|
||||
*/
|
||||
server: any;
|
||||
|
||||
/**
|
||||
* The ready state for the client. Either 'opening', 'open', 'closing', or 'closed'
|
||||
*/
|
||||
readyState: string;
|
||||
|
||||
/**
|
||||
* The remote IP for this connection
|
||||
*/
|
||||
remoteAddress: string;
|
||||
};
|
||||
|
||||
/**
|
||||
* The ID for this client. Regenerated at every connection
|
||||
*/
|
||||
id: string;
|
||||
|
||||
/**
|
||||
* The http.IncomingMessage request sent with the connection. Useful
|
||||
* for recovering headers etc
|
||||
*/
|
||||
request: any;
|
||||
|
||||
/**
|
||||
* The dictionary of sockets currently connect via this client (i.e. to different
|
||||
* namespaces) where the Socket ID is the key
|
||||
*/
|
||||
sockets: {[id: string]: Socket};
|
||||
|
||||
/**
|
||||
* A dictionary of all the namespaces for this client, with the Socket that
|
||||
* deals with that namespace
|
||||
*/
|
||||
nsps: {[nsp: string]: Socket};
|
||||
}
|
||||
}
|
||||
10
typings/tsd.d.ts
vendored
Normal file
10
typings/tsd.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
/// <reference path="bunyan/bunyan.d.ts" />
|
||||
/// <reference path="express/express.d.ts" />
|
||||
/// <reference path="mime/mime.d.ts" />
|
||||
/// <reference path="node/node.d.ts" />
|
||||
/// <reference path="serve-static/serve-static.d.ts" />
|
||||
/// <reference path="socket.io/socket.io.d.ts" />
|
||||
/// <reference path="underscore/underscore.d.ts" />
|
||||
/// <reference path="onoff/onoff.d.ts" />
|
||||
/// <reference path="form-data/form-data.d.ts" />
|
||||
/// <reference path="request/request.d.ts" />
|
||||
3629
typings/underscore/underscore.d.ts
vendored
Normal file
3629
typings/underscore/underscore.d.ts
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user