1 | _ = require 'lodash'
|
2 | request = require 'request'
|
3 |
|
4 | class NodeRegistryDownloader
|
5 | constructor: ->
|
6 | @cached = false
|
7 | @etag = null
|
8 | @data = null
|
9 | @_checkEtag = _.throttle @_checkEtagImmediately, 60*1000*5, leading: true, trailing: false
|
10 |
|
11 | setOptions: ({@registryUrl}) =>
|
12 |
|
13 | update: (callback) =>
|
14 | @_checkEtag()
|
15 | return callback null, @data if @cached
|
16 |
|
17 | request.get @registryUrl, json: true, (error, response, @data) =>
|
18 | return callback error if error?
|
19 | return callback new Error "invalid response code: #{response.statusCode}" if response.statusCode > 300
|
20 | @etag = response.headers.etag
|
21 | @cached = true
|
22 | callback null, @data
|
23 |
|
24 | _checkEtagImmediately: =>
|
25 | request.head @registryUrl, json: true, (error, response) =>
|
26 | return if error?
|
27 | return if @etag == response.headers.etag
|
28 | @etag = response.headers.etag
|
29 | @cached = false
|
30 |
|
31 | module.exports = NodeRegistryDownloader
|