asset-rack
Version:
Asset management framework for nodejs
102 lines (91 loc) • 3.29 kB
text/coffeescript
async = require 'async'
pkgcloud = require 'pkgcloud'
{BufferStream, extend} = require('./util')
ClientRack = require('./.').ClientRack
{EventEmitter} = require 'events'
class exports.Rack extends EventEmitter
constructor: (assets, options) ->
super()
options ?= {}
= options.maxAge
= options.allowNoHashCache
'complete', =>
= true
'newListener', (event, listener) =>
if event is 'complete' and is true
listener()
'error', (error) =>
throw error if ('error').length is 1
for asset in assets
asset.rack = this
= []
async.forEachSeries assets, (asset, next) =>
asset.on 'error', (error) =>
next error
asset.on 'complete', =>
if asset.contents?
.push asset
if asset.assets?
= .concat asset.assets
next()
asset.rack = this
asset.emit 'start'
, (error) =>
return 'error', error if error?
'complete'
createClientRack: ->
clientRack = new ClientRack
clientRack.rack = this
clientRack.emit 'start'
clientRack
addClientRack: (next) ->
clientRack = ()
clientRack.on 'complete', =>
.push clientRack
next()
handle: (request, response, next) ->
response.locals assets: this
handle = =>
for asset in
check = asset.checkUrl request.url
return asset.respond request, response if check
next()
if
handle()
else 'complete', handle
deploy: (options, next) ->
options.keyId = options.accessKey
options.key = options.secretKey
deploy = =>
client = pkgcloud.storage.createClient options
async.forEachSeries , (asset, next) =>
stream = new BufferStream asset.contents
url = asset.specificUrl.slice 1, asset.specificUrl.length
headers = {}
for key, value of asset.headers
headers[key] = value
headers['x-amz-acl'] = 'public-read'
options =
container: options.container
remote: url
headers: headers
stream: stream
client.upload options, (error) ->
return next error if error?
next()
, (error) ->
if error?
return next error if next?
throw error
next() if next?
if
deploy()
else 'complete', deploy
tag: (url) ->
for asset in
return asset.tag() if asset.url is url
throw new Error "No asset found for url: #{url}"
url: (url) ->
for asset in
return asset.specificUrl if url is asset.url
: extend