Use jst_server.Problem everywhere, make /_lib/post_request.jst use jst_server's new...
[ndcode_site.git] / _lib / post_request.jst
1 let jst_server = (await import('@ndcode/jst_server')).default
2 let stream_buffers = require('stream-buffers')
3
4 return async (env, handler) => {
5   if (env.request.method !== 'POST') {
6     env.response.setHeader('Allow', 'POST')
7     throw new jst_server.Problem(
8       'Method not allowed',
9       `The endpoint "${env.parsed_url.path}" requires a POST request.`,
10       405
11     )
12   }
13
14   let write_stream = new stream_buffers.WritableStreamBuffer()
15   let data = new Promise(
16     (resolve, reject) => {
17       write_stream.
18       on('finish', () => {resolve(write_stream.getContents())}).
19       on('error', () => {reject()})
20     }
21   )
22   env.request.pipe(write_stream)
23   let args = JSON.parse((await data).toString('utf-8'))
24   console.log('endpoint', env.parsed_url.path, 'args', JSON.stringify(args))
25
26   let result = await handler(...args)
27   if (result === undefined)
28     result = null
29   console.log('endpoint', env.parsed_url.path, 'result', JSON.stringify(result))
30
31   env.site.serve(
32     env,
33     200,
34     Buffer.from(JSON.stringify(result, null, 2) + '\n', 'utf-8'),
35     'post_request.jst'
36   )
37 }