UNPKG

2.91 kBJavaScriptView Raw
1'use strict'
2
3const ChatService = require('../index.js')
4
5const Promise = require('bluebird')
6const Redis = require('ioredis')
7const _ = require('lodash')
8const config = require('./config')
9const io = require('socket.io-client')
10
11function makeURL (port) {
12 port = port || config.port
13 return `${config.host}:${port}${config.namespace}`
14}
15
16function 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
29let state = null
30function setState (s) { state = s }
31
32let customCleanup = null
33function setCustomCleanup (fn) { customCleanup = fn }
34
35function clientConnect (name, port) {
36 let url = makeURL(port)
37 let params = makeParams(name)
38 return io.connect(url, params)
39}
40
41function 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
48if (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
65function 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
78function 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// fix for node 0.12
98let nextTick = (fn, ...args) => process.nextTick(() => fn(...args))
99
100let parallel = (fns, cb) =>
101 Promise.map(fns, Promise.fromCallback).asCallback(cb)
102
103let series = (fns, cb) =>
104 Promise.mapSeries(fns, Promise.fromCallback).asCallback(cb)
105
106module.exports = {
107 ChatService,
108 checkDB,
109 cleanup,
110 clientConnect,
111 closeInstance,
112 nextTick,
113 parallel,
114 series,
115 setCustomCleanup,
116 setState,
117 startService
118}