UNPKG

1.47 kBJavaScriptView Raw
1'use strict'
2
3const $cache = Symbol('cache')
4
5function 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
17const handlers = {}
18
19handlers.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
28function 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
38handlers.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
49handlers.DELETE = async ({ cache, redirect, response }) => {
50 delete cache[redirect]
51 send(response, 204)
52}
53
54module.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}