UNPKG

@tradle/http-keeper

Version:

Basic offline keeper with fallback to fetching files via http

234 lines (208 loc) 5.12 kB
var fs = require('fs') var http = require('http') var path = require('path') var parseUrl = require('url').parse var test = require('tape') var Q = require('q') var Keeper = require('../') var Offline = require('@tradle/offline-keeper') var Server = require('@tradle/bitkeeper-server') var memdown = require('memdown') var levelup = require('levelup') var basePort = 53352 var counter = 0 var newDB = function () { return levelup('tmp' + (counter++), { db: memdown, valueEncoding: 'binary' }) } test('invalid db encoding', function (t) { t.throws(function () { var keeper = new Keeper({ db: levelup('tmp' + (counter++), { db: memdown }) }) }) t.end() }) test('test invalid keys', function (t) { t.plan(1) var keeper = new Keeper({ db: newDB() }) keeper.put('a', new Buffer('b')) .then(function () { t.fail() }) .catch(function (err) { t.pass() }) .finally(function () { return keeper.close() }) .done() }) test('put same data twice', function (t) { t.plan(1) var keeper = new Keeper({ db: newDB() }) put() .then(put) .done(t.pass) function put () { return keeper.put('64fe16cc8a0c61c06bc403e02f515ce5614a35f1', new Buffer('1')) } }) test('put, get', function (t) { var keeper = new Keeper({ db: newDB() }) var k = [ // infoHashes of values '64fe16cc8a0c61c06bc403e02f515ce5614a35f1', '0a745fb75a7818acf09f27de1db7a76081d22776', 'bd45a097c00e557ea871233ea21d27a47f8f21a9' ] var v = ['1', '2', '3'].map(Buffer) keeper.putOne(k[0], v[0]) .then(function () { return keeper.getOne(k[0]) }) .then(function (v0) { t.deepEqual(v0, v[0]) }) .then(function () { // keeper should derive key return keeper.putMany(v.slice(1)) }) .then(function () { return keeper.getMany(k) }) .then(function (vals) { t.deepEqual(vals, v) }) .then(function () { return keeper.getAllKeys() }) .then(function (keys) { t.deepEqual(keys.sort(), k.slice().sort()) return keeper.getAllValues() }) .then(function (vals) { t.deepEqual(vals.sort(), v.slice().sort()) return keeper.getAll() }) .then(function (map) { t.deepEqual(Object.keys(map).sort(), k.slice().sort()) var vals = Object.keys(map).map(function (key) { return map[key] }) t.deepEqual(vals.sort(), v.slice().sort()) }) .done(function () { t.end() }) }) test('put, get, fallback', function (t) { // each server only has one value var map = { "64fe16cc8a0c61c06bc403e02f515ce5614a35f1": new Buffer('1'), "0a745fb75a7818acf09f27de1db7a76081d22776": new Buffer('2'), "bd45a097c00e557ea871233ea21d27a47f8f21a9": new Buffer('3'), "de1ea0a4ec16e8c7b10cb1dde3bf644be2fb5c57": new Buffer('4'), e: new Buffer('5') // invalid } var keys = Object.keys(map).sort(function (a, b) { if (a < b) return -1 if (a > b) return 1 return 0 }) var vals = keys.map(function (k) { return k === 'e' ? undefined : map[k] }) var togo = 0 var serverKeepers = [] var mkServers = keys.map(function (key, i) { togo++ var serverKeeper = new Offline({ db: newDB() }) serverKeepers.push(serverKeeper) return serverKeeper.put(key, map[key]) .catch(function (err) { // one value is invalid }) .then(function () { return Q.ninvoke(Server, 'create', { keeper: serverKeeper, port: basePort + i }) }) }) var servers var clientKeeper Q.all(mkServers) .then(function (_servers) { servers = _servers clientKeeper = new Keeper({ storeOnFetch: true, db: newDB(), fallbacks: servers.map(function (s, i) { return '127.0.0.1:' + (basePort + i) }) }) return clientKeeper.getMany(keys) }) .then(function (v) { t.deepEqual(v, vals) }) .then(function () { servers.forEach(function (server) { return server.close() }) // should be stored return clientKeeper.getMany(keys) }) .then(function (v) { t.deepEqual(v, vals) return clientKeeper.close() }) .done(function () { t.end() }) }) test('put upload', function (t) { var serverKeeper = new Offline({ db: newDB() }) var key = '64fe16cc8a0c61c06bc403e02f515ce5614a35f1' var val = new Buffer('1') var server var clientKeeper Q.ninvoke(Server, 'create', { keeper: serverKeeper, port: basePort }) .then(function (_server) { server = _server clientKeeper = new Keeper({ db: newDB(), fallbacks: [ '127.0.0.1:' + basePort ] }) return clientKeeper.putOne({ key: key, value: val, push: true }) }) .then(function () { return serverKeeper.getOne(key) }) .then(function (v) { t.deepEqual(v, val) t.end() server.close() return clientKeeper.close() }) .done() })