diff --git a/isso/__init__.py b/isso/__init__.py index 7122ff7..1f70390 100644 --- a/isso/__init__.py +++ b/isso/__init__.py @@ -183,7 +183,7 @@ def make_app(conf=None, threading=True, multiprocessing=False, uwsgi=False): wrapper.append(partial(wsgi.CORSMiddleware, origin=origin(isso.conf.getiter("general", "host")), - allowed=("Origin", "Content-Type"), exposed=("X-Set-Cookie", ))) + allowed=("Origin", "Content-Type"), exposed=("X-Set-Cookie", "Date"))) wrapper.extend([wsgi.SubURI, ProxyFix]) diff --git a/isso/js/app/api.js b/isso/js/app/api.js index 24de165..f0bc3a8 100644 --- a/isso/js/app/api.js +++ b/isso/js/app/api.js @@ -1,4 +1,4 @@ -define(["app/lib/promise"], function(Q) { +define(["app/lib/promise", "app/globals"], function(Q, globals) { "use strict"; @@ -41,8 +41,9 @@ define(["app/lib/promise"], function(Q) { function onload() { - var cookie = xhr.getResponseHeader("X-Set-Cookie"); + globals.offset.update(new Date(xhr.getResponseHeader("Date"))); + var cookie = xhr.getResponseHeader("X-Set-Cookie"); if (cookie && cookie.match(/^isso-/)) { document.cookie = cookie; } diff --git a/isso/js/app/globals.js b/isso/js/app/globals.js new file mode 100644 index 0000000..b3efe9d --- /dev/null +++ b/isso/js/app/globals.js @@ -0,0 +1,21 @@ +define(function() { + "use strict"; + + var Offset = function() { + this.values = []; + }; + + Offset.prototype.update = function(remoteTime) { + this.values.push((new Date()).getTime() - remoteTime); + }; + + Offset.prototype.localTime = function() { + return new Date((new Date()).getTime() + this.values.reduce( + function(a, b) { return a + b; }) / this.values.length); + }; + + return { + offset: new Offset() + }; + +}); \ No newline at end of file diff --git a/isso/js/app/isso.js b/isso/js/app/isso.js index d2b2077..fff7552 100644 --- a/isso/js/app/isso.js +++ b/isso/js/app/isso.js @@ -1,7 +1,7 @@ /* Isso – Ich schrei sonst! */ -define(["app/text/html", "app/dom", "app/utils", "app/config", "app/api", "app/markup", "app/i18n", "app/lib"], - function(templates, $, utils, config, api, Mark, i18n, lib) { +define(["app/text/html", "app/dom", "app/utils", "app/config", "app/api", "app/markup", "app/i18n", "app/lib", "app/globals"], + function(templates, $, utils, config, api, Mark, i18n, lib, globals) { "use strict"; @@ -100,7 +100,7 @@ define(["app/text/html", "app/dom", "app/utils", "app/config", "app/api", "app/m // update datetime every 60 seconds var refresh = function() { $(".permalink > date", el).textContent = utils.ago( - new Date(parseInt(comment.created, 10) * 1000)); + globals.offset.localTime(), new Date(parseInt(comment.created, 10) * 1000)); setTimeout(refresh, 60*1000); }; diff --git a/isso/js/app/utils.js b/isso/js/app/utils.js index dfe737c..7c8f1bf 100644 --- a/isso/js/app/utils.js +++ b/isso/js/app/utils.js @@ -5,9 +5,9 @@ define(["app/markup"], function(Mark) { return (document.cookie.match('(^|; )' + cookie + '=([^;]*)') || 0)[2]; }; - var ago = function(date) { + var ago = function(localTime, date) { - var diff = (((new Date()).getTime() - date.getTime()) / 1000), + var diff = ((localTime.getTime() - date.getTime()) / 1000), day_diff = Math.floor(diff / 86400); if (isNaN(day_diff) || day_diff < 0) {