UNPKG

2.54 kBtext/coffeescriptView Raw
1fs = require 'fs'
2http = require 'http'
3_ = require 'lodash'
4path = require 'path'
5glob = require 'glob'
6
7NOT_FOUND_RESPONSE = {metadata: {code: 404, status: http.STATUS_CODES[404]}}
8
9class MessageHandlers
10 constructor: ({ @defaultJobType, @jobsPath }={})->
11 throw new Error 'ConfigureHandler requires jobsPath' unless @jobsPath?
12 @jobs = @_getJobs()
13
14 onMessage: ({data, encrypted, metadata}, callback) =>
15 job = @jobs[metadata?.jobType]
16 job ?= @jobs[@defaultJobType] if @defaultJobType?
17 return callback null, NOT_FOUND_RESPONSE unless job?
18
19 job.action {encrypted}, {data, metadata}, (error, response) =>
20 return callback error if error?
21 return callback null, _.pick(response, 'data', 'metadata')
22
23 formSchema: (callback) =>
24 callback null, @_formSchemaFromJobs @jobs
25
26 messageSchema: (callback) =>
27 callback null, @_messageSchemaFromJobs @jobs
28
29 responseSchema: (callback) =>
30 callback null, @_responseSchemaFromJobs @jobs
31
32 _formSchemaFromJobs: (jobs) =>
33 return {
34 message: _.mapValues jobs, 'form'
35 }
36
37 _generateMessageMetadata: (jobType) =>
38 return {
39 type: 'object'
40 required: ['jobType']
41 properties:
42 jobType:
43 type: 'string'
44 enum: [jobType]
45 default: jobType
46 respondTo: {}
47 }
48
49 _generateResponseMetadata: =>
50 return {
51 type: 'object'
52 required: ['status', 'code']
53 properties:
54 status:
55 type: 'string'
56 code:
57 type: 'integer'
58 }
59
60 _getJobs: =>
61 dirnames = glob.sync path.join(@jobsPath, '/*/')
62 jobs = {}
63 _.each dirnames, (dir) =>
64 key = _.upperFirst _.camelCase path.basename dir
65 try
66 jobs[key] = require dir
67 catch error
68 console.error error.stack
69
70 return jobs
71
72 _messageSchemaFromJob: (job, key) =>
73 message = _.cloneDeep job.message
74 message ?= {}
75 _.set message, 'x-form-schema.angular', "message.#{key}.angular"
76 _.set message, 'x-response-schema', "#{key}"
77 _.set message, 'properties.metadata', @_generateMessageMetadata(key)
78 message.required = _.union ['metadata'], message.required
79 return message
80
81 _messageSchemaFromJobs: (jobs) =>
82 _.mapValues jobs, @_messageSchemaFromJob
83
84 _responseSchemaFromJob: (job) =>
85 response = _.cloneDeep job.response
86 _.set response, 'properties.metadata', @_generateResponseMetadata()
87 return response
88
89 _responseSchemaFromJobs: (jobs) =>
90 _.mapValues jobs, @_responseSchemaFromJob
91
92
93module.exports = MessageHandlers