Skip to content

Adding websocket support #6

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions dist/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ var _koaLocale = require('koa-locale');

var _koaLocale2 = _interopRequireDefault(_koaLocale);

var _koaWebsocket = require('koa-websocket');

var _koaWebsocket2 = _interopRequireDefault(_koaWebsocket);

var _Route = require('./routes/Route');

var _Route2 = _interopRequireDefault(_Route);
Expand Down Expand Up @@ -74,19 +78,26 @@ var App = function () {
_opt$docPath = opt.docPath,
docPath = _opt$docPath === undefined ? (0, _path.join)(__dirname, '..', 'apidoc') : _opt$docPath,
_opt$generateDoc = opt.generateDoc,
generateDoc = _opt$generateDoc === undefined ? false : _opt$generateDoc;
generateDoc = _opt$generateDoc === undefined ? false : _opt$generateDoc,
_opt$useWebSocket = opt.useWebSocket,
useWebSocket = _opt$useWebSocket === undefined ? false : _opt$useWebSocket;

this.routeParam = routeParam;
/**
* @ignore
* @type {number}
*/
this.port = port;
/**
* @ignore
* @type {boolean}
*/
this.useWebSocket = useWebSocket;
/**
* @ignore
* @type {Koa}
*/
this.koaApp = new _koa2.default();
this.koaApp = this.useWebSocket ? (0, _koaWebsocket2.default)(new _koa2.default()) : new _koa2.default();

(0, _koaLocale2.default)(this.koaApp);

Expand Down Expand Up @@ -184,6 +195,9 @@ var App = function () {
route.generateDoc = generateDoc;
route.mount();
this.koaApp.use(route.koaRouter.middleware());
if (this.useWebSocket && route.webSocketRouter) {
this.koaApp.ws.use(route.webSocketRouter);
}
}
} catch (err) {
_didIteratorError = true;
Expand Down
58 changes: 38 additions & 20 deletions dist/routes/Route.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ var _extends2 = require('babel-runtime/helpers/extends');

var _extends3 = _interopRequireDefault(_extends2);

var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');

var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);

var _getIterator2 = require('babel-runtime/core-js/get-iterator');

var _getIterator3 = _interopRequireDefault(_getIterator2);

var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');

var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);

var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');

var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
Expand Down Expand Up @@ -173,6 +173,14 @@ var Route = (_temp = _class = function () {
*/


/**
* @access public
* @desc mounts the tagged function as a GET route.
* @param {ParamsMethodDecorator} params the route's parameters
* @return {Decorator}
*/


/**
* @access public
* @desc mounts the tagged function as a POST route.
Expand Down Expand Up @@ -246,8 +254,29 @@ var Route = (_temp = _class = function () {
}, {
key: 'mount',
value: function mount() {
var _this = this;

if (this.disable !== true) {
for (var type in this.routes) {
var _loop = function _loop(route) {
var routePath = ('/' + _this.prefix + '/' + _this.routeBase + '/' + route.path).replace(/[/]{2,10}/g, '/').replace(/[/]$/, '');
if (!route.options.disable) {
_this.log(_chalk2.default.green.bold('[Mount route]'), '\t' + type + '\t', routePath);
if (type === 'websocket') {
_this.webSocketRouter = function (ctx) {
if (ctx.path === routePath) ctx.websocket.on(route.options.eventName, route.call);
};
} else {
var _koaRouter;

(_koaRouter = _this.koaRouter)[type].apply(_koaRouter, [routePath].concat((0, _toConsumableArray3.default)(_this._use(route))));
}
(0, _docGenerator.generateDoc)(_this, route);
} else {
_this.log(_chalk2.default.yellow.bold('[Disable Mount route]\t'), type, routePath);
}
};

// eslint-disable-line
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
Expand All @@ -257,18 +286,7 @@ var Route = (_temp = _class = function () {
for (var _iterator = (0, _getIterator3.default)(this.routes[type]), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var route = _step.value;

var routePath = ('/' + this.prefix + '/' + this.routeBase + '/' + route.path).replace(/[/]{2,10}/g, '/').replace(/[/]$/, '');
route.options.routePath = routePath;
route.options.type = type;
if (!route.options.disable) {
var _koaRouter;

this.log(_chalk2.default.green.bold('[Mount route]'), '\t' + type + '\t', routePath);
(_koaRouter = this.koaRouter)[type].apply(_koaRouter, [routePath].concat((0, _toConsumableArray3.default)(this._use(route))));
(0, _docGenerator.generateDoc)(this, route);
} else {
this.log(_chalk2.default.yellow.bold('[Disable Mount route]\t'), type, routePath);
}
_loop(route);
}
} catch (err) {
_didIteratorError = true;
Expand Down Expand Up @@ -384,7 +402,7 @@ var Route = (_temp = _class = function () {
}, {
key: '_beforeRoute',
value: function _beforeRoute(infos) {
var _this = this;
var _this2 = this;

return function () {
var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(ctx, next) {
Expand All @@ -393,7 +411,7 @@ var Route = (_temp = _class = function () {
switch (_context.prev = _context.next) {
case 0:
_context.next = 2;
return _this.beforeRoute(ctx, infos, next);
return _this2.beforeRoute(ctx, infos, next);

case 2:
return _context.abrupt('return', _context.sent);
Expand All @@ -403,7 +421,7 @@ var Route = (_temp = _class = function () {
return _context.stop();
}
}
}, _callee, _this);
}, _callee, _this2);
}));

return function (_x, _x2) {
Expand Down Expand Up @@ -965,5 +983,5 @@ var Route = (_temp = _class = function () {
}
}]);
return Route;
}(), _class.displayLog = true, _class.StatusCode = _StatusCode2.default, _class.Get = _RouteDecorators2.default.Get, _class.Post = _RouteDecorators2.default.Post, _class.Put = _RouteDecorators2.default.Put, _class.Patch = _RouteDecorators2.default.Patch, _class.Delete = _RouteDecorators2.default.Delete, _class.Route = _RouteDecorators2.default.Route, _temp);
}(), _class.displayLog = true, _class.StatusCode = _StatusCode2.default, _class.WebSocket = _RouteDecorators2.default.WebSocket, _class.Get = _RouteDecorators2.default.Get, _class.Post = _RouteDecorators2.default.Post, _class.Put = _RouteDecorators2.default.Put, _class.Patch = _RouteDecorators2.default.Patch, _class.Delete = _RouteDecorators2.default.Delete, _class.Route = _RouteDecorators2.default.Route, _temp);
exports.default = Route;
24 changes: 23 additions & 1 deletion dist/routes/RouteDecorators.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,16 @@ var RouteDecorators = function () {
return index === 0 ? '' + letter.toLowerCase() : '-' + letter.toLowerCase();
});
}

// replace A-Z to lowercase and add - ex myFunc => my-func

}, {
key: '_getEventFromMethode',
value: function _getEventFromMethode(str) {
return str.replace(/on([A-Z][a-z]*)/g, function (str, letter) {
return '' + letter.toLowerCase();
});
}
}, {
key: '_initData',
value: function _initData(target) {
Expand All @@ -69,7 +79,8 @@ var RouteDecorators = function () {
post: [],
delete: [],
patch: [],
put: []
put: [],
websocket: []
};
if (target.routeBase === undefined) {
target.routeBase = target.constructor.name.replace('Route', '');
Expand Down Expand Up @@ -119,6 +130,17 @@ var RouteDecorators = function () {
});
};
}
}, {
key: 'WebSocket',
value: function WebSocket(params) {
return function (target, key, descriptor) {
params = (0, _extends3.default)({
eventName: RouteDecorators._getEventFromMethode(key)
}, params);
var fuc = RouteDecorators._addRoute('websocket', params);
fuc(target, key, descriptor);
};
}
}, {
key: 'Get',
value: function Get(params) {
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"koa-i18n": "^2.1.0",
"koa-locale": "^1.3.0",
"koa-router": "^7.4.0",
"koa-websocket": "^5.0.1",
"koa2-ratelimit": "^0.8.0",
"lodash.clonedeep": "^4.5.0",
"lodash.uniq": "^4.5.0",
Expand Down
12 changes: 11 additions & 1 deletion src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { join as pathJoin } from 'path';
import { readdirSync } from 'fs';
import Koa from 'koa';
import locale from 'koa-locale';
import websockify from 'koa-websocket';

import Route from './routes/Route';
import notFound from './middlewares/notFound';
Expand All @@ -25,18 +26,24 @@ export default class App {
port = process.env.PORT || 3000,
docPath = pathJoin(__dirname, '..', 'apidoc'),
generateDoc = false,
useWebSocket = false,
} = opt;
this.routeParam = routeParam;
/**
* @ignore
* @type {number}
*/
this.port = port;
/**
* @ignore
* @type {boolean}
*/
this.useWebSocket = useWebSocket
/**
* @ignore
* @type {Koa}
*/
this.koaApp = new Koa();
this.koaApp = this.useWebSocket ? websockify(new Koa()) : new Koa();

locale(this.koaApp);

Expand Down Expand Up @@ -101,6 +108,9 @@ export default class App {
route.generateDoc = generateDoc;
route.mount();
this.koaApp.use(route.koaRouter.middleware());
if (this.useWebSocket && route.webSocketRouter) {
this.koaApp.ws.use(route.webSocketRouter);
}
}
}

Expand Down
19 changes: 16 additions & 3 deletions src/routes/Route.js
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,14 @@ export default class Route {
this.routeBase;
}

/**
* @access public
* @desc mounts the tagged function as a GET route.
* @param {ParamsMethodDecorator} params the route's parameters
* @return {Decorator}
*/
static WebSocket = RouteDecorators.WebSocket;

/**
* @access public
* @desc mounts the tagged function as a GET route.
Expand Down Expand Up @@ -177,11 +185,16 @@ export default class Route {
const routePath = `/${this.prefix}/${this.routeBase}/${route.path}`
.replace(/[/]{2,10}/g, '/')
.replace(/[/]$/, '');
route.options.routePath = routePath;
route.options.type = type;
if (!route.options.disable) {
this.log(chalk.green.bold('[Mount route]'), `\t${type}\t`, routePath);
this.koaRouter[type](routePath, ...this._use(route));
if (type === 'websocket') {
this.webSocketRouter = (ctx) => {
if (ctx.path === routePath)
ctx.websocket.on(route.options.eventName, route.call);
};
} else {
this.koaRouter[type](routePath, ...this._use(route));
}
generateDoc(this, route);
} else {
this.log(chalk.yellow.bold('[Disable Mount route]\t'), type, routePath);
Expand Down
18 changes: 18 additions & 0 deletions src/routes/RouteDecorators.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,21 @@ export default class RouteDecorators {
});
}

// replace A-Z to lowercase and add - ex myFunc => my-func
static _getEventFromMethode(str) {
return str.replace(/on([A-Z][a-z]*)/g, (str, letter) => {
return `${letter.toLowerCase()}`;
});
}

static _initData(target) {
target.routes = target.routes || {
get: [],
post: [],
delete: [],
patch: [],
put: [],
websocket: [],
};
if (target.routeBase === undefined) {
target.routeBase = target.constructor.name.replace('Route', '');
Expand Down Expand Up @@ -83,6 +91,16 @@ export default class RouteDecorators {
};
}

static WebSocket(params) {
return (target, key, descriptor) => {
params = {
eventName: RouteDecorators._getEventFromMethode(key),
...params,
};
const fuc = RouteDecorators._addRoute('websocket', params);
fuc(target, key, descriptor);
};
}
static Get(params) {
return (target, key, descriptor) => {
const fuc = RouteDecorators._addRoute('get', params);
Expand Down