UNPKG

1.35 kBtext/coffeescriptView Raw
1_ = require 'lodash'
2s3 = require 's3'
3CHANNEL_S3_BUCKET = 'octoblu-channels'
4CHANNEL_S3_KEY = 'channels.json'
5
6class ChannelDownloader
7 constructor: ->
8 @cached = false
9 @etag = null
10 @data = null
11 @_checkEtag = _.throttle @_checkEtagImmediately, 60*1000*5, leading: true, trailing: false
12
13 setOptions: (options) =>
14 @s3client ?= s3.createClient
15 s3Options:
16 accessKeyId: options.accessKeyId
17 secretAccessKey: options.secretAccessKey
18
19 update: (callback) =>
20 @_checkEtag()
21 return callback null, @data if @cached
22
23 downloader = @s3client.downloadBuffer
24 Bucket: CHANNEL_S3_BUCKET
25 Key: CHANNEL_S3_KEY
26
27 downloader.on 'httpHeaders', (statusCode, headers) ->
28 @etag = headers.etag
29
30 downloader.on 'error', callback
31 downloader.on 'end', (buffer) =>
32 try
33 @data = JSON.parse buffer
34 catch error
35 return callback error
36
37 @cached = true
38 callback null, @data
39
40 _checkEtagImmediately: =>
41 list = @s3client.listObjects
42 s3Params:
43 Bucket: CHANNEL_S3_BUCKET
44
45 list.on 'data', (data) =>
46 entry = _.find data.Contents, {'Key': 'channels.json'}
47 return unless entry?
48 return if @etag == entry.ETag
49 @etag = entry.ETag
50 @cached = false
51
52module.exports = ChannelDownloader