1 | 'use strict'
|
2 |
|
3 | const ChatService = require('../index.js')
|
4 |
|
5 | const Promise = require('bluebird')
|
6 | const Redis = require('ioredis')
|
7 | const _ = require('lodash')
|
8 | const config = require('./config')
|
9 | const io = require('socket.io-client')
|
10 |
|
11 | function makeURL (port) {
|
12 | port = port || config.port
|
13 | return `${config.host}:${port}${config.namespace}`
|
14 | }
|
15 |
|
16 | function makeParams (userName) {
|
17 | let params = {
|
18 | query: `user=${userName}`,
|
19 | multiplex: false,
|
20 | reconnection: false,
|
21 | transports: [ 'websocket' ]
|
22 | }
|
23 | if (!userName) {
|
24 | delete params.query
|
25 | }
|
26 | return params
|
27 | }
|
28 |
|
29 | let state = null
|
30 | function setState (s) { state = s }
|
31 |
|
32 | let customCleanup = null
|
33 | function setCustomCleanup (fn) { customCleanup = fn }
|
34 |
|
35 | function clientConnect (name, port) {
|
36 | let url = makeURL(port)
|
37 | let params = makeParams(name)
|
38 | return io.connect(url, params)
|
39 | }
|
40 |
|
41 | function startService (opts, hooks) {
|
42 | let options = { port: config.port }
|
43 | _.assign(options, state)
|
44 | _.assign(options, opts)
|
45 | return new ChatService(options, hooks)
|
46 | }
|
47 |
|
48 | if (process.env.TEST_REDIS_CLUSTER) {
|
49 | var redis = new Redis.Cluster(config.redisClusterConnect)
|
50 | var checkDB = () => Promise.map(
|
51 | redis.nodes('master'),
|
52 | node => node.dbsize().then(data => {
|
53 | if (data) { throw new Error('Unclean Redis DB') }
|
54 | }))
|
55 | var cleanDB = () => Promise.map(redis.nodes('master'), node => node.flushall()
|
56 | )
|
57 | } else {
|
58 | redis = new Redis(config.redisConnect)
|
59 | checkDB = () => redis.dbsize().then(data => {
|
60 | if (data) { throw new Error('Unclean Redis DB') }
|
61 | })
|
62 | cleanDB = () => redis.flushall()
|
63 | }
|
64 |
|
65 | function closeInstance (service) {
|
66 | if (!service) { return Promise.resolve() }
|
67 | return service.close()
|
68 | .timeout(2000)
|
69 | .catch(function (e) {
|
70 | console.log('Service closing error: ', e)
|
71 | return Promise.try(() => service.redis && service.redis.disconnect())
|
72 | .catchReturn()
|
73 | .then(() => Promise.fromCallback(cb => service.io.httpServer.close(cb)))
|
74 | .catchReturn()
|
75 | })
|
76 | }
|
77 |
|
78 | function cleanup (services, sockets, done) {
|
79 | services = _.castArray(services)
|
80 | sockets = _.castArray(sockets)
|
81 | return Promise.try(() => {
|
82 | for (let i = 0; i < sockets.length; i++) {
|
83 | let socket = sockets[i]
|
84 | socket && socket.disconnect()
|
85 | }
|
86 | if (customCleanup) {
|
87 | return Promise.fromCallback(customCleanup)
|
88 | } else {
|
89 | return Promise.map(services, closeInstance)
|
90 | }
|
91 | }).finally(() => {
|
92 | customCleanup = null
|
93 | return cleanDB()
|
94 | }).asCallback(done)
|
95 | }
|
96 |
|
97 |
|
98 | let nextTick = (fn, ...args) => process.nextTick(() => fn(...args))
|
99 |
|
100 | let parallel = (fns, cb) =>
|
101 | Promise.map(fns, Promise.fromCallback).asCallback(cb)
|
102 |
|
103 | let series = (fns, cb) =>
|
104 | Promise.mapSeries(fns, Promise.fromCallback).asCallback(cb)
|
105 |
|
106 | module.exports = {
|
107 | ChatService,
|
108 | checkDB,
|
109 | cleanup,
|
110 | clientConnect,
|
111 | closeInstance,
|
112 | nextTick,
|
113 | parallel,
|
114 | series,
|
115 | setCustomCleanup,
|
116 | setState,
|
117 | startService
|
118 | }
|