dnschain
Version:
A blockchain-based DNS + HTTPS server that fixes HTTPS security, and more!
97 lines (83 loc) • 3.59 kB
text/coffeescript
###
dnschain
http://dnschain.net
Copyright (c) 2014 okTurtles Foundation
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
###
if process.env.TEST_DNSCHAIN and not process.env.TEST_REAL_REDIS
redis = require 'fakeredis'
else
redis = require 'redis'
module.exports = (dnschain) ->
# expose these into our namespace
for k of dnschain.globals
eval "var #{k} = dnschain.globals.#{k};"
class ResolverCache
constructor: () ->
= gNewLogger 'Redis'
gFillWithRunningChecks @
start: ->
(cb) =>
= gConf.get 'redis:blockchain:enabled'
= gConf.get 'redis:oldDNS:enabled'
= gConf.get 'redis:oldDNS:ttl'
if ! and !
.info "cache not enabled".bold.yellow
else
.info "cache is enabled".bold
[host,port] = gConf.get('redis:socket').split(':')
=
if port?
if isNaN(portNum = parseInt port)
gErr "Redis port is NaN: #{port}"
redis.createClient portNum, host
else
redis.createClient host
.on 'error', (err) =>
.error "cache errored: #{err.message}", err
cb()
shutdown: ->
(cb) =>
?.end()
cb()
get: (key, valueRetriever, valueDoer) ->
.get key, (err, result) =>
if err
.error gLineInfo('caching error'), {err: err}
if result?
.debug gLineInfo('resolved from cache'), {key: key}
valueDoer null, key, JSON.parse result
return
valueRetriever key, (err2, ttl, value) =>
.setex(key, ttl, JSON.stringify value) if not err2
valueDoer err, key, value
resolveResource: (datastore, requestFn, serialization, cb) ->
if and datastore.cacheTTL?
retriever = (key, callback) =>
requestFn (err, result) =>
callback err, datastore.cacheTTL, result
doer = (err, key, result) =>
cb err, result
serialization, retriever, doer
else
requestFn cb
resolveOldDNS: (req, cb) ->
if
q = req.question[0]
retriever = (key, callback) =>
f = (err, result) =>
ttl =
if result.answer[0]?.ttl?
Math.min result.answer[0].ttl,
else
callback err, ttl, result
.dns.oldDNSLookup req, f
doer = (err, key, result) =>
cb err, result
"oldDNS:#{q.name}:#{q.type}", retriever, doer
else
.dns.oldDNSLookup req, cb