blob: 156ef373a5d53dbb97122a8eb71bf1cd33d2cee7 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
var debug = require('debug')('reader:syncbase:put');
var equal = require('deep-equal');
var error = require('../error');
var format = require('util').format;
var get = require('./get');
var ms = require('ms');
var vanadium = require('vanadium');
var verror = vanadium.verror;
var options = { strict: true };
module.exports = put;
function put(context, table, data, callback) {
get(context, table, data.id, onGet);
function onGet(err, old) {
if (err && !(err instanceof verror.NoExistError)) {
callback(err);
return;
}
// Skip put calls to syncbase if the content is the same as what exisits.
// This prevents recursion on put, watch, state update cycles over p2p sync.
if (equal(old, data, options)) {
debug('skipping put, old value is the same');
callback(null, data);
return;
}
var string = '';
try {
string = JSON.stringify(data);
} catch (e) {
var message = format('Failed to encode "%s"', data);
error(e, message, callback);
return;
}
var ctx = context.withTimeout(ms('5s'));
table.put(ctx, data.id, string, onPut);
}
function onPut(err) {
if (err) {
var template = 'table: "%s" .put(ctx, "%s", ...) failed';
var message = format(template, table.name, data.id);
error(err, message, callback);
return;
}
callback(null, data);
}
}