aboutsummaryrefslogtreecommitdiff
path: root/src/lib/request-handler.js
blob: 4330b6b70f8754c4bd4b25024c6106903f436213 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
const {getLogger} = require('./logger')
const {ResponseMessage, Connection} = require('./server')

class RequestHandler {

    constructor() {
        /**
         * @type {Map<string, Function>}
         */
        this.handlers = new Map()

        /**
         * @type {Logger}
         */
        this.logger = getLogger('RequestHandler')
    }

    /**
     * @param {string} requestType
     * @param {Function} handler
     */
    set(requestType, handler) {
        if (this.handlers.has(requestType))
            throw new Error(`handler for '${requestType}' has already been set`)

        this.handlers.set(requestType, handler)
    }

    /**
     * @param {RequestMessage} message
     * @param {Connection} connection
     */
    process(message, connection) {
        this.logger.info('process:', message)

        if (this.handlers.has(message.requestType)) {
            const f = this.handlers.get(message.requestType)
            const result = f(message.requestData || {}, message.requestNo, connection)
            if (result instanceof Promise) {
                result.catch(error => {
                    this.logger.error(`${message.requestType}:`, error)

                    connection.send(
                        new ResponseMessage(message.requestNo)
                            .setError('server error: ' + error?.message)
                    )
                })
            }
        } else {
            connection.send(
                new ResponseMessage(message.requestNo)
                    .setError(`unknown request type: '${message.requestType}'`)
            )
        }
    }

}

module.exports = RequestHandler