Skip to content

Commit 07af400

Browse files
committed
wip
1 parent dc16542 commit 07af400

File tree

5 files changed

+2890
-2951
lines changed

5 files changed

+2890
-2951
lines changed

README.md

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,18 @@ WIP public electron update server.
44

55
## Routes
66

7-
### `/:owner/:repo/:platform/:version`
8-
### `/:owner/:repo/win32/:version/RELEASES`
7+
### `/:owner/:repo/update/:platform/:version`
8+
9+
Check for updates
10+
11+
### `/:owner/:repo/update/win32/:version/RELEASES`
12+
### `/:owner/:repo/download/:platform`
13+
14+
Download latest
15+
16+
## Development
17+
18+
```bash
19+
$ npm install
20+
$ npm start
21+
```

bin/update-server.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/usr/bin/env node
2+
3+
'use strict'
4+
5+
process.title = 'update-server'
6+
7+
const Updates = require('..')
8+
9+
const updates = new Updates()
10+
const server = updates.listen(3000, () => {
11+
console.log(`http://localhost:${server.address().port}`)
12+
})

index.js

Lines changed: 75 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,80 @@
11
'use strict'
22

33
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+
}
1256
}
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+
}
1679

17-
server.listen(3000, () => console.log(`http://localhost:${server.address().port}`))
80+
module.exports = Updates

0 commit comments

Comments
 (0)