Skip to content
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

Livereload stream #118

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 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
14 changes: 12 additions & 2 deletions lib/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,23 @@ const debug = require('debug')('tinylr:server');
const CONTENT_TYPE = 'content-type';
const FORM_TYPE = 'application/x-www-form-urlencoded';

function wrapStream (path) {
return function () {
return fs.createReadStream(path);
};
}

class Server extends events.EventEmitter {
constructor (options = {}) {
super();

this.options = options;

options.livereload = options.livereload || require.resolve('livereload-js/dist/livereload.js');
options.livereload = typeof options.livereload === 'string'
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you put ? ... at the end of the line instead of line breaking before ? ?

options.livereload = typeof options.livereload === 'string' ? wrapStream(options.livereload)
  : typeof options.livereload === 'function' ? options.livereload
  : wrapStream(require.resolve('livereload-js/dist/livereload.js'));

? wrapStream(options.livereload)
: typeof options.livereload === 'function'
? options.livereload
: wrapStream(require.resolve('livereload-js/dist/livereload.js'));

// todo: change falsy check to allow 0 for random port
options.port = parseInt(options.port || 35729, 10);
Expand Down Expand Up @@ -214,7 +224,7 @@ class Server extends events.EventEmitter {

livereload (req, res) {
res.setHeader('Content-Type', 'application/javascript');
fs.createReadStream(this.options.livereload).pipe(res);
this.options.livereload().pipe(res);
}

changed (req, res) {
Expand Down
2 changes: 1 addition & 1 deletion test/helpers/listen.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export default function listen (opts) {
opts = opts || {};

return function _listen (done) {
this.app = new Server();
this.app = new Server(opts);
const srv = this.server = this.app.server;
const ctx = this;
this.server.listen(err => {
Expand Down
120 changes: 120 additions & 0 deletions test/server-custom-livereload.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import request from 'supertest';
import assert from 'assert';
import listen from './helpers/listen';
import {PassThrough} from 'stream';

describe('tiny-lr', () => {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you change the description to something like tiny-lr custom livereload to differentiate it from the other tests in the test output ?

before(listen({
livereload: function () {
const s = new PassThrough();

s.end('// custom live-reload');

return s;
}
}));

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All the below tests, except maybe one GET /livereload.js, are copy-pasted from server.js. Can you try to refactor these two files to use a function passed to the parent describe in order to not duplicate these tests ?

Something like:

describe('tiny-lr custom livereload', () => {
  before(...)

  testLR(this);

  // divergent tests here, mainly GET /livereload.js
});

with testLR including all common tests from these two files. and using a param like context to map the this passed as a parameter.

describe('GET /', () => {
it('respond with nothing, but respond', function (done) {
request(this.server)
.get('/')
.expect('Content-Type', /json/)
.expect(/\{"tinylr":"Welcome","version":"[\d].[\d].[\d]+"\}/)
.expect(200, done);
});

it('unknown route respond with proper 404 and error message', function (done) {
request(this.server)
.get('/whatev')
.expect('Content-Type', /json/)
.expect('{"error":"not_found","reason":"no such route"}')
.expect(404, done);
});
});

describe('GET /changed', () => {
it('with no clients, no files', function (done) {
request(this.server)
.get('/changed')
.expect('Content-Type', /json/)
.expect(/"clients":\[\]/)
.expect(/"files":\[\]/)
.expect(200, done);
});

it('with no clients, some files', function (done) {
request(this.server)
.get('/changed?files=gonna.css,test.css,it.css')
.expect('Content-Type', /json/)
.expect('{"clients":[],"files":["gonna.css","test.css","it.css"]}')
.expect(200, done);
});
});

describe('POST /changed', () => {
it('with no clients, no files', function (done) {
request(this.server)
.post('/changed')
.expect('Content-Type', /json/)
.expect(/"clients":\[\]/)
.expect(/"files":\[\]/)
.expect(200, done);
});

it('with no clients, some files', function (done) {
const data = { clients: [], files: ['cat.css', 'sed.css', 'ack.js'] };

request(this.server)
.post('/changed')
// .type('json')
.send({ files: data.files })
.expect('Content-Type', /json/)
.expect(JSON.stringify(data))
.expect(200, done);
});
});

describe('POST /alert', () => {
it('with no clients, no message', function (done) {
const data = { clients: [] };
request(this.server)
.post('/alert')
.expect('Content-Type', /json/)
.expect(JSON.stringify(data))
.expect(200, done);
});

it('with no clients, some message', function (done) {
const message = 'Hello Client!';
const data = { clients: [], message: message };
request(this.server)
.post('/alert')
.send({ message: message })
.expect('Content-Type', /json/)
.expect(JSON.stringify(data))
.expect(200, done);
});
});

describe('GET /livereload.js', () => {
it('respond with livereload script', function (done) {
request(this.server)
.get('/livereload.js')
.expect('// custom live-reload')
.expect(200, done);
});
});

describe('GET /kill', () => {
it('shutdown the server', function (done) {
const srv = this.server;
request(srv)
.get('/kill')
.expect(200, err => {
if (err) return done(err);
assert.ok(!srv._handle);
done();
});
});
});
});