1 | 'use strict'
|
2 |
|
3 | const $cache = Symbol('cache')
|
4 |
|
5 | function send (response, statusCode, value) {
|
6 | if (value) {
|
7 | response.writeHead(statusCode, {
|
8 | 'Content-Type': 'text/plain',
|
9 | 'Content-Length': value.length
|
10 | })
|
11 | } else {
|
12 | response.writeHead(statusCode)
|
13 | }
|
14 | response.end(value)
|
15 | }
|
16 |
|
17 | const handlers = {}
|
18 |
|
19 | handlers.GET = async ({ cache, redirect, response }) => {
|
20 | const value = cache[redirect]
|
21 | if (value === undefined) {
|
22 | send(response, 204)
|
23 | } else {
|
24 | send(response, 200, value)
|
25 | }
|
26 | }
|
27 |
|
28 | function readBody (request) {
|
29 | return new Promise((resolve, reject) => {
|
30 | const buffer = []
|
31 | request
|
32 | .on('data', chunk => buffer.push(chunk.toString()))
|
33 | .on('error', reject)
|
34 | .on('end', () => resolve(buffer.join('')))
|
35 | })
|
36 | }
|
37 |
|
38 | handlers.POST = async ({ cache, redirect, request, response }) => {
|
39 | let statusCode
|
40 | if (Object.prototype.hasOwnProperty.call(cache, redirect)) {
|
41 | statusCode = 200
|
42 | } else {
|
43 | statusCode = 201
|
44 | }
|
45 | cache[redirect] = await readBody(request)
|
46 | send(response, statusCode)
|
47 | }
|
48 |
|
49 | handlers.DELETE = async ({ cache, redirect, response }) => {
|
50 | delete cache[redirect]
|
51 | send(response, 204)
|
52 | }
|
53 |
|
54 | module.exports = {
|
55 | async validate (mapping) {
|
56 | mapping[$cache] = {}
|
57 | },
|
58 |
|
59 | async redirect ({ mapping, match, redirect, request, response }) {
|
60 | const handler = handlers[request.method]
|
61 | if (handler) {
|
62 | return handler({ cache: mapping[$cache], redirect, request, response })
|
63 | }
|
64 | return 500
|
65 | }
|
66 | }
|