UNPKG

2.21 kBJavaScriptView Raw
1'use strict'
2
3const ChatServiceError = require('./ChatServiceError')
4const Promise = require('bluebird')
5const _ = require('lodash')
6const util = require('util')
7
8let debuglog = util.debuglog('ChatService')
9
10let asyncLimit = 32
11
12let nameChecker = /^[^\u0000-\u001F:{}\u007F]+$/
13
14function possiblyCallback (args) {
15 let cb = _.last(args)
16 if (_.isFunction(cb)) {
17 args = _.slice(args, 0, -1)
18 } else {
19 cb = null
20 }
21 return [args, cb]
22}
23
24function checkNameSymbols (name) {
25 if (_.isString(name) && nameChecker.test(name)) {
26 return Promise.resolve()
27 } else {
28 return Promise.reject(new ChatServiceError('invalidName', name))
29 }
30}
31
32function execHook (hook, ...args) {
33 if (!hook) { return Promise.resolve() }
34 let cb, callbackResults, hasResults
35 let wrapper = function (...data) {
36 hasResults = true
37 callbackResults = data
38 if (cb) { cb(...data) }
39 }
40 let res = hook(...args, wrapper)
41 if (hasResults) {
42 return Promise.fromCallback(
43 fn => { fn(...callbackResults) },
44 {multiArgs: true})
45 } else if ((res != null) && typeof res.then === 'function') {
46 return res
47 } else {
48 return Promise.fromCallback(fn => { cb = fn }, {multiArgs: true})
49 }
50}
51
52function run (self, gen) {
53 return Promise.coroutine(gen).call(self)
54}
55
56function logError (error) {
57 let isServiceError = error instanceof ChatServiceError
58 if (!isServiceError) {
59 debuglog(error)
60 }
61 return Promise.reject(error)
62}
63
64function convertError (error, useRawErrorObjects) {
65 if (error != null) {
66 if (!useRawErrorObjects) {
67 return error.toString()
68 }
69 let isServiceError = error instanceof ChatServiceError
70 if (!isServiceError) {
71 return new ChatServiceError('internalError', error.toString())
72 }
73 }
74 return error
75}
76
77function resultsTransform (useRawErrorObjects, cb) {
78 if (!cb) { return null }
79 return function (error, data, ...rest) {
80 error = convertError(error, useRawErrorObjects)
81 if (error == null) { error = null }
82 if (data == null) { data = null }
83 return cb(error, data, ...rest)
84 }
85}
86
87module.exports = {
88 asyncLimit,
89 convertError,
90 checkNameSymbols,
91 execHook,
92 logError,
93 possiblyCallback,
94 resultsTransform,
95 run
96}