Skip to content
This repository has been archived by the owner on Mar 29, 2022. It is now read-only.

Commit

Permalink
Merge pull request #112 from dotdoom/server-timestamp
Browse files Browse the repository at this point in the history
Align 'now' in Targaryen with firebase-server time
  • Loading branch information
urish authored Nov 19, 2017
2 parents e642de1 + 6a5a5e7 commit 0eff193
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 11 deletions.
24 changes: 13 additions & 11 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -173,11 +173,11 @@ FirebaseServer.prototype = {
send({d: {r: requestId, b: {s: 'permission_denied', d: 'Permission denied'}}, t: 'd'});
}

function replaceServerTimestamp(data) {
function replaceServerTimestamp(value, data) {
if (_.isEqual(data, firebase.database.ServerValue.TIMESTAMP)) {
return server._clock();
return value;
} else if (_.isObject(data)) {
return _.mapValues(data, replaceServerTimestamp);
return _.mapValues(data, replaceServerTimestamp.bind(this, value));
} else {
return data;
}
Expand All @@ -191,17 +191,17 @@ FirebaseServer.prototype = {
}
}

function tryPatch(requestId, path, newData) {
const result = server._targaryen.as(authData()).update(path, newData);
function tryPatch(requestId, path, newData, now) {
const result = server._targaryen.as(authData()).update(path, newData, now);
if (!result.allowed) {
permissionDenied(requestId);
throw new Error(`Permission denied for client to update at ${path}: ${result.info}`);
}
server._targaryen = result.newDatabase;
}

function tryWrite(requestId, path, newData) {
const result = server._targaryen.as(authData()).write(path, newData);
function tryWrite(requestId, path, newData, now) {
const result = server._targaryen.as(authData()).write(path, newData, now);
if (!result.allowed) {
permissionDenied(requestId);
throw new Error(`Permission denied for client to write to ${path}: ${result.info}`);
Expand Down Expand Up @@ -236,10 +236,11 @@ FirebaseServer.prototype = {
const path = normalizedPath.path;
_log(`Client update ${path}`);

newData = replaceServerTimestamp(newData);
let now = server._clock();
newData = replaceServerTimestamp(now, newData);

try {
tryPatch(requestId, path, newData);
tryPatch(requestId, path, newData, now);
} catch (e) {
_log(e);
return;
Expand All @@ -255,7 +256,8 @@ FirebaseServer.prototype = {
let progress = Promise.resolve(true);
const path = normalizedPath.path;

newData = replaceServerTimestamp(newData);
let now = server._clock();
newData = replaceServerTimestamp(now, newData);

if (normalizedPath.isPriorityPath) {
progress = exportData(fbRef).then(parentData => {
Expand All @@ -272,7 +274,7 @@ FirebaseServer.prototype = {
}

progress = progress.then(() => {
tryWrite(requestId, path, newData);
tryWrite(requestId, path, newData, now);
});

if (typeof hash !== 'undefined') {
Expand Down
34 changes: 34 additions & 0 deletions test/server.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,40 @@ describe('Firebase Server', () => {
}
});
});

it('should succeed in comparing ServerValue.TIMESTAMP to now', done => {
const port = newFirebaseServer({
Firebase: 'great!'
});
server.setRules({
rules: {
'timestamp': {
'.write': 'newData.val() === now'
},
},
});

const client = newFirebaseClient(port);
client.child('timestamp').set(
firebase.database.ServerValue.TIMESTAMP,
co.wrap(function *(err) {
if (err) {
done(err);
return;
}
assert((yield server.getValue()).timestamp);
client.update({
'timestamp': firebase.database.ServerValue.TIMESTAMP,
}, co.wrap(function *(err) {
if (err) {
done(err);
return;
}
assert((yield server.getValue()).timestamp);
done();
}));
}));
});
});

describe('#setPriority', () => {
Expand Down

0 comments on commit 0eff193

Please sign in to comment.