diff --git a/www/common/cryptget.js b/www/common/cryptget.js index 144c9dff9..31e48e8ce 100644 --- a/www/common/cryptget.js +++ b/www/common/cryptget.js @@ -1,59 +1,87 @@ define([ - '/customize/messages.js?app=read', + '/customize/messages.js?app=cryptget', '/bower_components/chainpad-crypto/crypto.js', '/bower_components/chainpad-netflux/chainpad-netflux.js', '/common/cryptpad-common.js', -], function (Messages, Crypto, Realtime, Cryptpad) { - var Crypt = {}; + '/bower_components/textpatcher/TextPatcher.js', + '/bower_components/jquery/dist/jquery.min.js', +], function (Messages, Crypto, Realtime, Cryptpad, TextPatcher) { + var noop = function () {}; + var finish = function (S, err, doc) { + if (S.done) { return; } + S.cb(err, doc); + S.done = true; - var finish = function (Session, err, doc) { - if (Session.done) { return; } - Session.cb(err, doc); - Session.done = true; - - var abort = Cryptpad.find(Session, - ['realtime', 'realtime', 'abort']); - if (typeof(abort) === 'function') { abort(); } - }; - - var get = Crypt.get = function (hash, cb, opt) { - if (typeof(cb) !== 'function') { - throw new Error('Crypt.get expects a callback'); + var abort = Cryptpad.find(S, ['realtime', 'realtime', 'abort']); + if (typeof(abort) === 'function') { + S.realtime.realtime.sync(); + abort(); } + }; - var Session = { - cb: cb, - }; - opt = opt || {}; - var secret = Session.secret = Cryptpad.getSecrets(hash); - + var makeConfig = function (hash) { + var secret = Cryptpad.getSecrets(hash); + if (!secret.keys) { secret.keys = secret.key; } // support old hashses var config = { websocketURL: Cryptpad.getWebsocketURL(), channel: secret.channel, + validateKey: secret.keys.validateKey || undefined, crypto: Crypto.createEncryptor(secret.keys), logLevel: 0, }; + return config; + }; - var onError = config.onError = function () { - finish(Session, Messages.websocketError); - }; - var onAbort = config.onAbort = function () { - finish(Session, Messages.disconnectAlert); - }; + var isObject = function (o) { + return typeof(o) === 'object'; + }; + + var overwrite = function (a, b) { + if (!(isObject(a) && isObject(b))) { return; } + Object.keys(b).forEach(function (k) { a[k] = b[k]; }); + }; + + var get = function (hash, cb, opt) { + if (typeof(cb) !== 'function') { + throw new Error('Cryptget expects a callback'); + } + var Session = { cb: cb, }; + var config = makeConfig(hash); var onReady = config.onReady = function (info) { - var realtime = Session.realtime = info.realtime; - finish(Session, void 0, realtime.getUserDoc()); + var rt = Session.session = info.realtime; + finish(Session, void 0, rt.getUserDoc()); }; + overwrite(config, opt); + + var realtime = Session.realtime = Realtime.start(config); + }; - var onConnectionChange = config.onConnectionChange = function (info) { - if (info.state) { return; } - finish(Session, Messages.disconnectAlert); + var put = function (hash, doc, cb, opt) { + if (typeof(cb) !== 'function') { + throw new Error('Cryptput expects a callback'); + } + + var config = makeConfig(hash); + var Session = { cb: cb, }; + config.onReady = function (info) { + var realtime = Session.session = info.realtime; + + TextPatcher.create({ + realtime: realtime, + })(doc); + realtime.sync(); + realtime.abort(); + + finish(Session, void 0); }; - Object.keys(opt).forEach(function (k) { config[k] = opt[k]; }); + overwrite(config, opt); - return (Session.realtime = Realtime.start(config)); + var realtime = Session.session = Realtime.start(config); }; - return Crypt; + return { + get: get, + put: put, + }; });