11 changed files with 913 additions and 1242 deletions
Split View
Diff Options
-
3bower.json
-
0www/common/metadata-manager.js
-
2www/common/sframe-boot.js
-
7www/common/sframe-boot2.js
-
441www/common/sframe-chainpad-netflux-inner.js
-
300www/common/sframe-chainpad-netflux-outer.js
-
115www/common/sframe-channel.js
-
76www/common/sframe-ctrl.js
-
32www/common/sframe-protocol.js
-
1139www/pad2/main.js
-
40www/pad2/outer.js
@ -1,76 +0,0 @@ |
|||
// This file provides the external API for launching and talking to the sandboxed iframe.
|
|||
// The internal API is in sframe-channel.js
|
|||
define([ |
|||
'/common/requireconfig.js' |
|||
], function (RequireConfig) { |
|||
var iframe; |
|||
var handlers = {}; |
|||
var queries = {}; |
|||
var module = { exports: {} }; |
|||
|
|||
var mkTxid = function () { |
|||
return Math.random().toString(16).replace('0.', '') + Math.random().toString(16).replace('0.', ''); |
|||
}; |
|||
|
|||
module.exports.init = function (frame, cb) { |
|||
if (iframe) { throw new Error('already initialized'); } |
|||
var txid = mkTxid(); |
|||
var intr = setInterval(function () { |
|||
frame.contentWindow.postMessage(JSON.stringify({ |
|||
txid: txid, |
|||
content: { requireConf: RequireConfig }, |
|||
q: 'INIT' |
|||
}), '*'); |
|||
}); |
|||
window.addEventListener('message', function (msg) { |
|||
var data = JSON.parse(msg.data); |
|||
if (!iframe) { |
|||
if (data.txid !== txid) { return; } |
|||
clearInterval(intr); |
|||
iframe = frame; |
|||
cb(); |
|||
} else if (typeof(data.q) === 'string' && handlers[data.q]) { |
|||
handlers[data.q](data, msg); |
|||
} else if (typeof(data.q) === 'undefined' && queries[data.txid]) { |
|||
queries[data.txid](data, msg); |
|||
} else { |
|||
console.log("Unhandled message"); |
|||
console.log(msg); |
|||
} |
|||
}); |
|||
}; |
|||
|
|||
module.exports.query = function (q, content, cb) { |
|||
if (!iframe) { throw new Error('not yet initialized'); } |
|||
var txid = mkTxid(); |
|||
var timeout = setTimeout(function () { |
|||
delete queries[txid]; |
|||
cb("Timeout making query " + q); |
|||
}); |
|||
queries[txid] = function (data, msg) { |
|||
clearTimeout(timeout); |
|||
delete queries[txid]; |
|||
cb(undefined, data.content, msg); |
|||
}; |
|||
iframe.contentWindow.postMessage(JSON.stringify({ |
|||
txid: txid, |
|||
content: content, |
|||
q: q |
|||
}), '*'); |
|||
}; |
|||
|
|||
module.exports.registerHandler = function (queryType, handler) { |
|||
if (typeof(handlers[queryType]) !== 'undefined') { throw new Error('already registered'); } |
|||
handlers[queryType] = function (msg) { |
|||
var data = JSON.parse(msg.data); |
|||
handler(data.content, function (replyContent) { |
|||
msg.source.postMessage(JSON.stringify({ |
|||
txid: data.txid, |
|||
content: replyContent |
|||
}), '*'); |
|||
}, msg); |
|||
}; |
|||
}; |
|||
|
|||
return module.exports; |
|||
}); |
|||
@ -1,5 +1,33 @@ |
|||
// This file defines all of the RPC calls
|
|||
// The internal API is in sframe-channel.js
|
|||
// This file defines all of the RPC calls which are used between the inner and outer iframe.
|
|||
// Define *querys* (which expect a response) using Q_<query name>
|
|||
// Define *events* (which expect no response) using EV_<event name>
|
|||
// Please document the queries and events you create, and please please avoid making generic
|
|||
// "do stuff" events/queries which are used for many different things because it makes the
|
|||
// protocol unclear.
|
|||
define({ |
|||
// When the iframe first launches, this query is sent repeatedly by the controller
|
|||
// to wait for it to awake and give it the requirejs config to use.
|
|||
'Q_INIT': true, |
|||
|
|||
// When either the outside or inside registers a query handler, this is sent.
|
|||
'EV_REGISTER_HANDLER': true, |
|||
|
|||
// Realtime events called from the outside.
|
|||
// When someone joins the pad, argument is a string with their netflux id.
|
|||
'EV_RT_JOIN': true, |
|||
// When someone leaves the pad, argument is a string with their netflux id.
|
|||
'EV_RT_LEAVE': true, |
|||
// When you have been disconnected, no arguments.
|
|||
'EV_RT_DISCONNECT': true, |
|||
// When you have connected, argument is an object with myID: string, members: list, readOnly: boolean.
|
|||
'EV_RT_CONNECT': true, |
|||
// Called after the history is finished synchronizing, no arguments.
|
|||
'EV_RT_READY': true, |
|||
// Called from both outside and inside, argument is a (string) chainpad message.
|
|||
'Q_RT_MESSAGE': true, |
|||
|
|||
// Called from the outside, this informs the inside whenever the user's data has been changed.
|
|||
// The argument is the object representing the content of the user profile minus the netfluxID
|
|||
// which changes per-reconnect.
|
|||
'EV_USERDATA_UPDATE': true |
|||
}); |
|||
1139
www/pad2/main.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,13 +1,39 @@ |
|||
|
|||
define([ |
|||
'/common/sframe-ctrl.js', |
|||
'jquery' |
|||
], function (SFrameCtrl, $) { |
|||
'/common/sframe-channel.js', |
|||
'jquery', |
|||
'/common/sframe-chainpad-netflux-outer.js', |
|||
'/bower_components/nthen/index.js', |
|||
'/common/cryptpad-common.js', |
|||
'/bower_components/chainpad-crypto/crypto.js' |
|||
], function (SFrameChannel, $, CpNfOuter, nThen, Cryptpad, Crypto) { |
|||
console.log('xxx'); |
|||
$(function () { |
|||
console.log('go'); |
|||
SFrameCtrl.init($('#sbox-iframe')[0], function () { |
|||
console.log('\n\ndone\n\n'); |
|||
nThen(function (waitFor) { |
|||
$(waitFor()); |
|||
}).nThen(function (waitFor) { |
|||
SFrameChannel.init($('#sbox-iframe')[0].contentWindow, waitFor(function () { |
|||
console.log('sframe initialized'); |
|||
})); |
|||
Cryptpad.ready(waitFor()); |
|||
}).nThen(function (waitFor) { |
|||
Cryptpad.onError(function (info) { |
|||
console.log('error'); |
|||
console.log(info); |
|||
if (info && info.type === "store") { |
|||
//onConnectError();
|
|||
} |
|||
}); |
|||
}).nThen(function (waitFor) { |
|||
var secret = Cryptpad.getSecrets(); |
|||
var readOnly = secret.keys && !secret.keys.editKeyStr; |
|||
if (!secret.keys) { secret.keys = secret.key; } |
|||
|
|||
var outer = CpNfOuter.start({ |
|||
channel: secret.channel, |
|||
network: Cryptpad.getNetwork(), |
|||
validateKey: secret.keys.validateKey || undefined, |
|||
readOnly: readOnly, |
|||
crypto: Crypto.createEncryptor(secret.keys), |
|||
}); |
|||
}); |
|||
}); |
|||
Write
Preview
Loading…
Cancel
Save