1
1
'use strict'
2
2
3
3
const http = require ( 'http' )
4
- const hazel = require ( 'hazel-server' )
5
-
6
- const server = http . createServer ( ( req , res ) => {
7
- const segs = req . url . split ( '/' ) . filter ( Boolean )
8
- const [ account , repository ] = segs
9
- if ( ! account || ! repository ) {
10
- res . statusCode = 404
11
- return res . end ( 'Not found' )
4
+
5
+ class Updates {
6
+ constructor ( ) {
7
+ this . cache = new Map ( )
8
+ }
9
+
10
+ listen ( port , cb ) {
11
+ const server = http . createServer ( ( req , res ) => {
12
+ this . handle ( req , res ) . catch ( err => {
13
+ console . error ( err . stack )
14
+ res . statusCode = err . statusCode || 500
15
+ res . end ( err . stack )
16
+ } )
17
+ } )
18
+ server . listen ( port , cb )
19
+ return server
20
+ }
21
+
22
+ async handle ( req , res ) {
23
+ const segs = req . url . split ( '/' ) . filter ( Boolean )
24
+ const [ account , repository , method , platform , version ] = segs
25
+
26
+ if ( account && repository && method === 'update' && platform && version ) {
27
+ this . handleUpdate ( res , account , repository , platform , version )
28
+ } else if ( account && repository && method === 'download' && platform ) {
29
+ this . handleDownload ( res , account , repository , platform )
30
+ } else {
31
+ notFound ( res )
32
+ }
33
+ }
34
+
35
+ handleUpdate ( res , account , repository , platform , version ) {
36
+ const key = `${ account } /${ repository } /${ platform } `
37
+ if ( this . cache . has ( key ) ) {
38
+ const latest = this . cache . get ( key )
39
+ if ( latest . version === version ) return noContent ( res )
40
+ json ( res , {
41
+ name : latest . version ,
42
+ url : `/${ account } /${ repository } /download/${ platform } `
43
+ } )
44
+ } else {
45
+ if ( this . cache . has ( `${ account / repository } ` ) ) return notFound ( res )
46
+ }
47
+ }
48
+
49
+ handleDownload ( res , account , repository , platform ) {
50
+ const key = `${ account } /${ repository } /${ platform } `
51
+ if ( this . cache . has ( key ) ) {
52
+ const latest = this . cache . get ( key )
53
+ redirect ( res , latest . url )
54
+ } else {
55
+ }
12
56
}
13
- req . url = '/' + segs . slice ( 2 ) . join ( '/' )
14
- hazel ( { account, repository } ) ( req , res )
15
- } )
57
+ }
58
+
59
+ const notFound = res => {
60
+ res . statusCode = 404
61
+ res . end ( 'Not found' )
62
+ }
63
+
64
+ const noContent = res => {
65
+ res . statusCode = 204
66
+ res . end ( )
67
+ }
68
+
69
+ const json = ( res , obj ) => {
70
+ res . setHeader ( 'Content-Type' , 'application/json' )
71
+ res . end ( JSON . stringify ( obj ) )
72
+ }
73
+
74
+ const redirect = ( res , url ) => {
75
+ res . statusCode = 302
76
+ res . setHeader ( 'Location' , url )
77
+ res . end ( url )
78
+ }
16
79
17
- server . listen ( 3000 , ( ) => console . log ( `http://localhost: ${ server . address ( ) . port } ` ) )
80
+ module . exports = Updates
0 commit comments