rtail 0.2.0 → 2.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +508 -73
  3. package/bin/rtail.js +91 -0
  4. package/package.json +15 -67
  5. package/.jscsrc +0 -28
  6. package/.jshintrc +0 -11
  7. package/.npmignore +0 -4
  8. package/.scss-lint.yml +0 -11
  9. package/cli/lib/webapp.js +0 -53
  10. package/cli/rtail-client.js +0 -156
  11. package/cli/rtail-server.js +0 -144
  12. package/dist/bundle.min.js +0 -18
  13. package/dist/css/bundle.min.css +0 -199
  14. package/dist/images/common/btn-fav-off.svg +0 -16
  15. package/dist/images/common/btn-fav-on.svg +0 -16
  16. package/dist/images/common/favicon-16x16.png +0 -0
  17. package/dist/images/common/favicon-32x32.png +0 -0
  18. package/dist/images/common/favicon-96x96.png +0 -0
  19. package/dist/images/common/icn-filter.svg +0 -16
  20. package/dist/images/common/icn-resume.svg +0 -16
  21. package/dist/images/common/logo-rtail.svg +0 -26
  22. package/dist/images/dark/btn-github.svg +0 -16
  23. package/dist/images/dark/btn-info.svg +0 -20
  24. package/dist/images/dark/btn-json-collapse.svg +0 -16
  25. package/dist/images/dark/btn-json-expand.svg +0 -16
  26. package/dist/images/dark/btn-settings.svg +0 -16
  27. package/dist/images/dark/icn-close-date.svg +0 -16
  28. package/dist/images/dark/icn-font-decrease.svg +0 -19
  29. package/dist/images/dark/icn-font-increase.svg +0 -19
  30. package/dist/images/dark/icn-font-reset.svg +0 -18
  31. package/dist/images/dark/icn-search.svg +0 -16
  32. package/dist/images/dark/icn-sort-asc.svg +0 -18
  33. package/dist/images/dark/icn-sort-desc.svg +0 -18
  34. package/dist/images/dark/icn-theme-dark.svg +0 -18
  35. package/dist/images/dark/icn-theme-light.svg +0 -26
  36. package/dist/images/dark/logo-lukibear.svg +0 -74
  37. package/dist/images/dark/logo-rtail-info.svg +0 -26
  38. package/dist/images/light/btn-github.svg +0 -16
  39. package/dist/images/light/btn-info.svg +0 -20
  40. package/dist/images/light/btn-json-collapse.svg +0 -16
  41. package/dist/images/light/btn-json-expand.svg +0 -16
  42. package/dist/images/light/btn-settings.svg +0 -16
  43. package/dist/images/light/icn-close-date.svg +0 -16
  44. package/dist/images/light/icn-font-decrease.svg +0 -19
  45. package/dist/images/light/icn-font-increase.svg +0 -19
  46. package/dist/images/light/icn-font-reset.svg +0 -18
  47. package/dist/images/light/icn-search.svg +0 -16
  48. package/dist/images/light/icn-sort-asc.svg +0 -18
  49. package/dist/images/light/icn-sort-desc.svg +0 -18
  50. package/dist/images/light/icn-theme-dark.svg +0 -18
  51. package/dist/images/light/icn-theme-light.svg +0 -26
  52. package/dist/images/light/logo-lukibear.svg +0 -74
  53. package/dist/images/light/logo-rtail-info.svg +0 -26
  54. package/dist/index.html +0 -1
  55. package/scripts/npm-publish.sh +0 -21
  56. package/scripts/set-version.sh +0 -7
  57. package/test/rtail-client.test.js +0 -131
  58. package/test/rtail-server.test.js +0 -138
  59. package/test/runner.js +0 -31
  60. package/test/util.js +0 -65
@@ -1,26 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
- <svg width="96px" height="25px" viewBox="0 0 96 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
3
- <!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
4
- <title>light/logo-rtail-info</title>
5
- <desc>Created with Sketch.</desc>
6
- <defs></defs>
7
- <g id="rTail---assets" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
8
- <g id="webapp-assets@2x" sketch:type="MSArtboardGroup" transform="translate(-1305.000000, -433.000000)" fill="#FFFFFF">
9
- <g id="light" sketch:type="MSLayerGroup" transform="translate(100.000000, 83.000000)">
10
- <g id="assets" transform="translate(40.000000, 70.000000)" sketch:type="MSShapeGroup">
11
- <g id="light/logo-rtail-info" transform="translate(1165.000000, 280.000000)">
12
- <g id="rTail" transform="translate(42.000000, 0.000000)">
13
- <path d="M0.08,6.496 L2.32,6.496 L2.32,9.024 L2.384,9.024 C2.64000128,8.40533024 2.9546648,7.9093352 3.328,7.536 C3.7013352,7.1626648 4.1013312,6.8693344 4.528,6.656 C4.9546688,6.4426656 5.4079976,6.29866704 5.888,6.224 C6.3680024,6.14933296 6.84266432,6.09066688 7.312,6.048 L7.312,8.416 C6.52266272,8.48000032 5.80266992,8.65599856 5.152,8.944 C4.50133008,9.23200144 3.9626688,9.63199744 3.536,10.144 C3.15199808,10.6346691 2.8533344,11.183997 2.64,11.792 C2.4266656,12.400003 2.32,13.0559965 2.32,13.76 L2.32,24 L0.08,24 L0.08,6.496 Z M13.264,2.464 L7.824,2.464 L7.824,0.32 L21.04,0.32 L21.04,2.464 L15.632,2.464 L15.632,24 L13.264,24 L13.264,2.464 Z M24.848,15.296 C24.848,16.2773382 25.018665,17.1999957 25.36,18.064 C25.701335,18.9280043 26.1866635,19.6799968 26.816,20.32 C27.4453365,20.9600032 28.2026622,21.4666648 29.088,21.84 C29.9733378,22.2133352 30.949328,22.4 32.016,22.4 C32.9546714,22.4 33.8506624,22.2186685 34.704,21.856 C35.5573376,21.4933315 36.3039968,20.9973365 36.944,20.368 C37.5840032,19.7386635 38.0906648,18.986671 38.464,18.112 C38.8373352,17.237329 39.024,16.2880051 39.024,15.264 C39.024,14.3039952 38.8480018,13.386671 38.496,12.512 C38.1439982,11.637329 37.6533365,10.8746699 37.024,10.224 C36.3946635,9.57333008 35.6533376,9.05066864 34.8,8.656 C33.9466624,8.26133136 33.0186717,8.064 32.016,8.064 C31.0559952,8.064 30.1440043,8.23466496 29.28,8.576 C28.4159957,8.91733504 27.6533366,9.39733024 26.992,10.016 C26.3306634,10.6346698 25.8080019,11.3919955 25.424,12.288 C25.0399981,13.1840045 24.848,14.1866611 24.848,15.296 L24.848,15.296 Z M41.136,24 L38.896,24 L38.896,20.928 L38.832,20.928 C38.3413309,21.653337 37.7973363,22.2399978 37.2,22.688 C36.6026637,23.1360022 35.9946698,23.4879987 35.376,23.744 C34.7573302,24.0000013 34.1546696,24.1759995 33.568,24.272 C32.9813304,24.3680005 32.4640022,24.416 32.016,24.416 C30.6293264,24.416 29.3600058,24.1706691 28.208,23.68 C27.0559942,23.1893309 26.0640042,22.5280042 25.232,21.696 C24.3999958,20.8639958 23.754669,19.8880056 23.296,18.768 C22.837331,17.6479944 22.608,16.458673 22.608,15.2 C22.608,14.0266608 22.8319978,12.8906722 23.28,11.792 C23.7280022,10.6933278 24.3573293,9.7173376 25.168,8.864 C25.9786707,8.0106624 26.9653275,7.32800256 28.128,6.816 C29.2906725,6.30399744 30.5866595,6.048 32.016,6.048 C32.4853357,6.048 33.0186637,6.09599952 33.616,6.192 C34.2133363,6.28800048 34.8213302,6.46399872 35.44,6.72 C36.0586698,6.97600128 36.6613304,7.33333104 37.248,7.792 C37.8346696,8.25066896 38.3626643,8.84266304 38.832,9.568 L38.896,9.568 L38.896,6.496 L41.136,6.496 L41.136,24 Z M45.2,0.32 L47.44,0.32 L47.44,4.352 L45.2,4.352 L45.2,0.32 Z M45.2,6.496 L47.44,6.496 L47.44,24 L45.2,24 L45.2,6.496 Z M51.6,0.32 L53.84,0.32 L53.84,24 L51.6,24 L51.6,0.32 Z"></path>
14
- </g>
15
- <g id="lines">
16
- <rect id="Rectangle-6" x="0" y="0" width="20" height="2"></rect>
17
- <rect id="Rectangle-7" x="0" y="7" width="30" height="2"></rect>
18
- <rect id="Rectangle-8" x="0" y="14" width="24" height="2"></rect>
19
- <rect id="Rectangle-9" x="0" y="21" width="13" height="2"></rect>
20
- </g>
21
- </g>
22
- </g>
23
- </g>
24
- </g>
25
- </g>
26
- </svg>
package/dist/index.html DELETED
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html ng-app="app" ng-controller="MainController as ctrl"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title ng-if="!ctrl.loaded">rTail : loading ...</title><title ng-if="ctrl.loaded">rTail : {{ctrl.activeStream}}</title><link rel="stylesheet" href="css/bundle.min.css"><link href="//fonts.googleapis.com/css?family=Source+Code+Pro|Roboto+Mono|Inconsolata|Anonymous+Pro|Ubuntu+Mono|Droid+Sans+Mono|Nunito:300" rel="stylesheet" type="text/css"><link rel="icon" href="images/common/favicon-16x16.png" sizes="16x16"><link rel="icon" href="images/common/favicon-32x32.png" sizes="32x32"><link rel="icon" href="images/common/favicon-96x96.png" sizes="96x96"></head><body class="{{ctrl.theme}} font-family-{{ctrl.fontFamily}} font-size-{{ctrl.fontSize}}"><header><div class="rtail-logo"></div><button class="btn btn-info" popup-show="popover-info" popup-placement="bottom"></button> <a class="btn btn-github" href="https://github.com/kilianc/rtail" target="_blank"></a> <button class="btn btn-settings" popup-show="popover-settings" popup-placement="bottom"></button></header><div class="split-pane"><div class="sidebar" ng-style="{ width: ctrl.sidebarWidth }" resizable><div class="search-box"><input type="text" placeholder="Search streams" ng-model="ctrl.streamsListFilter"></div><div class="stream-sections"><div class="stream-section"><h4>Favorites</h4><a ng-repeat="(stream, active) in ctrl.favorites | orderBy:''" ng-class="{ selected: ctrl.isSelected(stream) }" ui-sref="streams({ stream: stream })"><span>{{::stream}}</span> <i ng-show="stream.unread"></i></a></div><div class="stream-section"><h4>Streams</h4><a ng-repeat="stream in ctrl.streams | filter:ctrl.streamsListFilter | orderBy:''" ng-class="{ selected: ctrl.isSelected(stream) }" ng-hide="ctrl.favorites[stream]" ui-sref="streams({ stream: stream })"><span>{{::stream}}</span> <i ng-show="stream.unread"></i></a></div></div><div class="resize-handler"></div><div class="fade"></div></div><div class="stream-view"><div class="stream-header"><div class="stream-title" ng-click="ctrl.toggleFavorite(ctrl.activeStream)" ng-show="ctrl.activeStream"><i class="stream-title-favorite" ng-class="{ on: ctrl.favorites[ctrl.activeStream] }"></i> {{ctrl.activeStream}}</div><div class="filter-box"><input type="text" ng-model="ctrl.activeStreamRegExp" ng-trim="false" placeholder="filter stream (regexp allowed)"></div></div><div class="stream-lines"><div class="stream-line" ng-repeat="line in ctrl.lines | filter:ctrl.activeStreamFilter | orderBy:'timestamp':!ctrl.streamDirection"><div class="stream-line-timestamp" ng-hide="ctrl.hiddenTimestamps[ctrl.activeStream]">{{::line.timestamp | amDateFormat:'MM/DD/YY hh:mm:ss'}}</div><button class="btn-toggle-timestamp" ng-if="$last" ng-style="{ left: ctrl.toggleTimestampButtonX }" ng-class="{ closed: ctrl.hiddenTimestamps[ctrl.activeStream] }" ng-click="ctrl.toggleTimestamp(ctrl.activeStream)" title="Toggle timestamp column"></button><div class="stream-line-content {{::line.type}}"><span ng-bind-html="::line.html"></span></div></div></div><button class="btn-resume" ng-click="ctrl.resume()" ng-show="ctrl.paused">Resume</button></div></div><script type="text/ng-template" id="popover-info"><div class="popover-content popover-info"> <div class="rtail-logo"></div> <div class="version">Version {{ctrl.version}}</div> <a class="btn btn-issue" href="https://github.com/kilianc/rtail/issues" target="_blank"> Report issue </a> <a class="btn btn-fork" href="https://github.com/kilianc/rtail/fork" target="_blank"> Fork it </a> <div class="lukibear-logo"></div> </div></script><script type="text/ng-template" id="popover-settings"><div class="popover-content popover-settings"> <h4>Font size</h4> <div class="btn-group"> <button class="btn btn-font-smaller" ng-class="{ selected: ctrl.fontSize < 4 }" ng-click="ctrl.decFontSize()"></button> <button class="btn btn-font-reset" ng-class="{ selected: 4 === ctrl.fontSize }" ng-click="ctrl.resetFontSize()"></button> <button class="btn btn-font-bigger" ng-class="{ selected: ctrl.fontSize > 4 }" ng-click="ctrl.incFontSize()"></button> </div> <h4>Font family</h4> <div class="btn-group six-grid"> <button class="btn btn-font-1 font-family-1" ng-class="{ selected: 1 === ctrl.fontFamily }" ng-click="ctrl.setFontFamily(1)">Ag</button> <button class="btn btn-font-2 font-family-2" ng-class="{ selected: 2 === ctrl.fontFamily }" ng-click="ctrl.setFontFamily(2)">Ag</button> <button class="btn btn-font-3 font-family-3" ng-class="{ selected: 3 === ctrl.fontFamily }" ng-click="ctrl.setFontFamily(3)">Ag</button> <button class="btn btn-font-4 font-family-4" ng-class="{ selected: 4 === ctrl.fontFamily }" ng-click="ctrl.setFontFamily(4)">Ag</button> <button class="btn btn-font-5 font-family-5" ng-class="{ selected: 5 === ctrl.fontFamily }" ng-click="ctrl.setFontFamily(5)">Ag</button> <button class="btn btn-font-6 font-family-6" ng-class="{ selected: 6 === ctrl.fontFamily }" ng-click="ctrl.setFontFamily(6)">Ag</button> </div> <h4>Sorting</h4> <div class="btn-group"> <button class="btn btn-sorting-asc" ng-class="{ selected: ctrl.streamDirection }" ng-click="ctrl.setStreamDirection(true)"></button> <button class="btn btn-sorting-desc" ng-class="{ selected: !ctrl.streamDirection }" ng-click="ctrl.setStreamDirection(false)"></button> </div> <h4>Theme</h4> <div class="btn-group"> <button class="btn btn-theme-dark" ng-class="{ selected: 'dark' === ctrl.theme }" ng-click="ctrl.setTheme('dark')"></button> <button class="btn btn-theme-light" ng-class="{ selected: 'light' === ctrl.theme }" ng-click="ctrl.setTheme('light')"></button> </div> </div></script><script src="bundle.min.js"></script></body></html>
@@ -1,21 +0,0 @@
1
- set -e
2
-
3
- if [ ! -n "$NPM_PUBLISH" ]; then
4
- echo "Skipping npm publish, NPM_PUBLISH is not set."
5
- exit 0
6
- fi
7
-
8
- if [ ! -n "$NPM_TOKEN" ]; then
9
- echo "Please set NPM_TOKEN env variable"
10
- exit 1
11
- fi
12
-
13
- if [ ! -n "$NPM_EMAIL" ]; then
14
- echo "Please set NPM_EMAIL env variable"
15
- exit 1
16
- fi
17
-
18
- echo "_auth = $NPM_TOKEN" > ~/.npmrc
19
- echo "email = $NPM_EMAIL" >> ~/.npmrc
20
-
21
- npm publish
@@ -1,7 +0,0 @@
1
- set -e
2
-
3
- if [ ! -z "$NPM_PUBLISH" ]; then
4
- echo "setting VERSION env"
5
- export VERSION=`node -e "console.log(require('./package.json').version)"`
6
- export AWS_BUCKET_URL="$AWS_BUCKET_URL/$VERSION/"
7
- fi
@@ -1,131 +0,0 @@
1
- /*!
2
- * cli.test.js
3
- * Created by Kilian Ciuffolo on Jul 7, 2015
4
- * (c) 2015
5
- */
6
-
7
- 'use strict'
8
-
9
- const assert = require('chai').assert
10
- const dgram = require('dgram')
11
- const dns = require('dns')
12
- const os = require('os')
13
- const s = require('./util').s
14
- const spawnClient = require('./util').spawnClient
15
-
16
- describe('rtail-client.js', function () {
17
- it('should split stdin by \\n', function (done) {
18
- spawnClient({
19
- args: [],
20
- done: done,
21
- test: function (messages) {
22
- assert.equal(3, messages.length, s(messages))
23
-
24
- assert.equal(messages[0].content, '0')
25
- assert.equal(messages[1].content, '1')
26
- assert.equal(messages[2].content, '2')
27
-
28
- assert.isDefined(messages[0].id)
29
- assert.isNumber(messages[0].timestamp)
30
- }
31
- }).stdin.end(['0', '1', '2', ''].join('\n'))
32
- })
33
-
34
- it('should use custom name', function (done) {
35
- spawnClient({
36
- args: ['--name', 'test'],
37
- done: done,
38
- test: function (messages) {
39
- assert.equal(3, messages.length, s(messages))
40
- assert.equal(messages[0].id, 'test')
41
- }
42
- }).stdin.end(['0', '1', '2', ''].join('\n'))
43
- })
44
-
45
- it('should respect --mute', function (done) {
46
- let client = spawnClient({ args: ['--mute'], done: done })
47
- client.stdout.on('data', function (data) {
48
- done(new Error('Expected no output instead got: "' + data.toString() + '"'))
49
- })
50
- client.stdin.end(['0', '1', '2', ''].join('\n'))
51
- })
52
-
53
- it('should parse JSON lines', function (done) {
54
- spawnClient({
55
- args: [],
56
- done: done,
57
- test: function (messages) {
58
- assert.equal(1, messages.length, s(messages))
59
- assert.equal(messages[0].content.foo, 'bar')
60
- }
61
- }).stdin.end(['{ "foo": "bar" }', ''].join('\n'))
62
- })
63
-
64
- it('should parse JSON5 lines', function (done) {
65
- spawnClient({
66
- args: [],
67
- done: done,
68
- test: function (messages) {
69
- assert.equal(1, messages.length, s(messages))
70
- assert.equal(messages[0].content.foo, 'bar')
71
- }
72
- }).stdin.end(['{ foo: "bar" }', ''].join('\n'))
73
- })
74
-
75
- it('should support custom port / host', function (done) {
76
- dns.lookup(os.hostname(), function (err, address) {
77
- let socket = dgram.createSocket('udp4')
78
- socket.bind(9998, address)
79
-
80
- spawnClient({
81
- done: done,
82
- socket: socket,
83
- args: ['-p', '9998', '-h', address],
84
- test: function (messages) {
85
- assert.equal(1, messages.length, s(messages))
86
- assert.equal(messages[0].content.foo, 'bar')
87
- }
88
- }).stdin.end(['{ foo: "bar" }', ''].join('\n'))
89
- })
90
- })
91
-
92
- it('should strip colors with --no-tty', function (done) {
93
- let client = spawnClient({
94
- args: ['--no-tty'],
95
- done: done
96
- })
97
-
98
- client.stdout.on('data', function (data) {
99
- assert.equal(data.toString(), 'Hello world\n')
100
- })
101
-
102
- client.stdin.end(['\u001b[31mHello world\u001b[0m', ''].join('\n'))
103
- })
104
-
105
- it('should parse date if --parse-date', function (done) {
106
- let date = 'Wed Jul 08 2010 01:01:03 GMT-0700 (PDT)'
107
- let client = spawnClient({
108
- done: done,
109
- test: function (messages) {
110
- assert.equal(messages[0].timestamp, Date.parse(date))
111
- assert.equal(messages[0].content, 'hello')
112
- }
113
- })
114
-
115
- client.stdin.end(['[' + date + '] hello', ''].join('\n'))
116
- })
117
-
118
- it('should not parse date if --no-parse-date', function (done) {
119
- let date = 'Wed Jul 08 2010 01:01:03 GMT-0700 (PDT)'
120
- let client = spawnClient({
121
- args: ['--no-parse-date'],
122
- done: done,
123
- test: function (messages) {
124
- assert.notEqual(messages[0].timestamp, Date.parse(date))
125
- assert.equal(messages[0].content, '[' + date + '] hello')
126
- }
127
- })
128
-
129
- client.stdin.end(['[' + date + '] hello', ''].join('\n'))
130
- })
131
- })
@@ -1,138 +0,0 @@
1
- /*!
2
- * rtail-server.js
3
- * Created by Kilian Ciuffolo on Jul 7, 2015
4
- * (c) 2015
5
- */
6
-
7
- 'use strict'
8
-
9
- const assert = require('chai').assert
10
- const dgram = require('dgram')
11
- const dns = require('dns')
12
- const io = require('socket.io/node_modules/socket.io-client')
13
- const spawnClient = require('./util').spawnClient
14
- const spawnServer = require('./util').spawnServer
15
- const get = require('request').get
16
- const os = require('os')
17
-
18
- describe('rtail-server.js', function () {
19
- this.timeout(5000)
20
-
21
- let server = null
22
- let streams = null
23
- let lines = []
24
- let backlogs = []
25
- let fakeSocket = { close: function () {}, on: function () {} }
26
-
27
- before(function (done) {
28
- server = spawnServer()
29
-
30
- setTimeout(function () {
31
- spawnClient({ socket: fakeSocket }).stdin.end(['1', '2', ''].join('\n'))
32
- spawnClient({ socket: fakeSocket }).stdin.end(['1', '2', ''].join('\n'))
33
-
34
- setTimeout(function () {
35
- let ws = io.connect('http://localhost:8888')
36
-
37
- ws.on('streams', function (data) {
38
- if (null === streams) {
39
- ws.emit('select stream', data[0])
40
- }
41
- streams = data
42
- })
43
-
44
- ws.on('backlog', function (data) {
45
- backlogs.push(data)
46
- spawnClient({ args: ['--name', streams[0]], socket: fakeSocket }).stdin.end(['A', 'B', ''].join('\n'))
47
- })
48
-
49
- ws.on('line', function (data) {
50
- lines.push(data)
51
- if (lines.length >= 2) done()
52
- })
53
- }, 500)
54
- }, 500)
55
- })
56
-
57
- after(function () {
58
- server.kill()
59
- })
60
-
61
- it('should send the streams list on connect (WS)', function () {
62
- assert.lengthOf(streams, 2)
63
- })
64
-
65
- it('should listen for messages', function () {
66
- assert.equal(lines[0].content, 'A')
67
- assert.equal(lines[1].content, 'B')
68
- })
69
-
70
- it('should skip non JSON messages', function () {
71
- let socket = dgram.createSocket('udp4')
72
- let buffer = new Buffer('foo')
73
- socket.send(buffer, 0, buffer.length, 9999, 'localhost')
74
- })
75
-
76
- it('should serve the webapp', function (done) {
77
- server.kill()
78
- server = spawnServer()
79
-
80
- setTimeout(function () {
81
- get('http://localhost:8888', function (err, res, body) {
82
- if (err) return done(err)
83
- assert.match(body, /ng-app="app"/)
84
- done(err)
85
- })
86
- }, 1000)
87
- })
88
-
89
-
90
- it('should serve the webapp from s3', function (done) {
91
- server.kill()
92
- server = spawnServer({
93
- args: ['--web-version', 'stable']
94
- })
95
-
96
- setTimeout(function () {
97
- get('http://localhost:8888/index.html', function (err, res, body) {
98
- if (err) return done(err)
99
- assert.match(body, /ng-app="app"/)
100
- assert.isDefined(res.headers['x-amz-request-id'])
101
- done(err)
102
- })
103
- }, 1000)
104
- })
105
-
106
- it('should support custom port / host', function (done) {
107
- server.kill()
108
-
109
- dns.lookup(os.hostname(), function (err, address) {
110
- server = spawnServer({
111
- args: [
112
- '--udp-host', address,
113
- '--udp-port', 9998,
114
- '--web-host', address,
115
- '--web-port', 8889,
116
- ]
117
- })
118
-
119
- // check websocket
120
- setTimeout(function () {
121
- spawnClient({
122
- socket: fakeSocket,
123
- args: ['--port', 9998, '--host', address, '--name', 'foobar']
124
- }).stdin.end(['1', '2', ''].join('\n'))
125
-
126
- setTimeout(function () {
127
- let ws = io.connect('http://' + address + ':8889')
128
-
129
- ws.on('streams', function (data) {
130
- assert.lengthOf(data, 1)
131
- assert.equal(data[0], 'foobar')
132
- done()
133
- })
134
- }, 500)
135
- }, 1000)
136
- })
137
- })
138
- })
package/test/runner.js DELETED
@@ -1,31 +0,0 @@
1
- /*!
2
- * runner.js
3
- * Created by Kilian Ciuffolo on Jul 7, 2015
4
- * (c) 2015
5
- */
6
-
7
- 'use strict'
8
-
9
- const path = require('path')
10
- const Mocha = require('mocha')
11
-
12
- const argv = process.argv
13
- const NODE_ENV = process.env.NODE_ENV
14
- const regExp = new RegExp((argv[2] || '').trim() || '.')
15
-
16
- console.log(' Running test suite with NODE_ENV=%s (%s)', NODE_ENV, regExp)
17
-
18
- let mocha = new Mocha()
19
- mocha.suite.bail(true)
20
- mocha.reporter('spec')
21
- mocha.useColors(true)
22
-
23
- ;[
24
- 'rtail-client',
25
- 'rtail-server'
26
- ].forEach(function (file) {
27
- if (!regExp.test(file)) return
28
- mocha.addFile(path.join(__dirname, '../', 'test', file + '.test.js'))
29
- })
30
-
31
- mocha.run(process.exit)
package/test/util.js DELETED
@@ -1,65 +0,0 @@
1
- /*!
2
- * util.js
3
- * Created by Kilian Ciuffolo on Jul 7, 2015
4
- * (c) 2015
5
- */
6
-
7
- 'use strict'
8
-
9
- const spawn = require('child_process').spawn
10
- const dgram = require('dgram')
11
-
12
- /**
13
- *
14
- */
15
- module.exports.spawnClient = function spawnClient(opts) {
16
- opts = opts || {}
17
-
18
- if (!opts.socket) {
19
- opts.socket = dgram.createSocket('udp4')
20
- opts.socket.bind(9999)
21
- }
22
-
23
- let client = spawn('cli/rtail-client.js', opts.args)
24
- let messages = []
25
-
26
- client.stderr.pipe(process.stderr)
27
-
28
- opts.socket.on('message', function (data) {
29
- messages.push(JSON.parse(data))
30
- })
31
-
32
- client.on('exit', function (code) {
33
- let err = code ? new Error('rtail exited with code: ' + code) : null
34
- opts.test && opts.test(messages)
35
- opts.socket.close()
36
- opts.done && opts.done(err)
37
- })
38
-
39
- return client
40
- }
41
-
42
- /**
43
- *
44
- */
45
- module.exports.spawnServer = function spawnServer(opts) {
46
- opts = opts || {}
47
-
48
- let server = spawn('cli/rtail-server.js', opts.args)
49
- server.stderr.pipe(process.stderr)
50
- server.stdout.pipe(process.stdout)
51
-
52
- server.on('exit', function (code) {
53
- let err = code ? new Error('rtail exited with code: ' + code) : null
54
- opts.done && opts.done(err)
55
- })
56
-
57
- return server
58
- }
59
-
60
- /**
61
- *
62
- */
63
- module.exports.s = function s(obj) {
64
- return JSON.stringify(obj, null, ' ')
65
- }