1 | 'use strict'
|
2 |
|
3 | const ChatServiceError = require('./ChatServiceError')
|
4 | const Promise = require('bluebird')
|
5 | const _ = require('lodash')
|
6 | const util = require('util')
|
7 |
|
8 | let debuglog = util.debuglog('ChatService')
|
9 |
|
10 | let asyncLimit = 32
|
11 |
|
12 | let nameChecker = /^[^\u0000-\u001F:{}\u007F]+$/
|
13 |
|
14 | function 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 |
|
24 | function 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 |
|
32 | function 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 |
|
52 | function run (self, gen) {
|
53 | return Promise.coroutine(gen).call(self)
|
54 | }
|
55 |
|
56 | function logError (error) {
|
57 | let isServiceError = error instanceof ChatServiceError
|
58 | if (!isServiceError) {
|
59 | debuglog(error)
|
60 | }
|
61 | return Promise.reject(error)
|
62 | }
|
63 |
|
64 | function 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 |
|
77 | function 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 |
|
87 | module.exports = {
|
88 | asyncLimit,
|
89 | convertError,
|
90 | checkNameSymbols,
|
91 | execHook,
|
92 | logError,
|
93 | possiblyCallback,
|
94 | resultsTransform,
|
95 | run
|
96 | }
|