1 | _ = require 'lodash'
|
2 | s3 = require 's3'
|
3 | CHANNEL_S3_BUCKET = 'octoblu-channels'
|
4 | CHANNEL_S3_KEY = 'channels.json'
|
5 |
|
6 | class 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 |
|
52 | module.exports = ChannelDownloader
|