wrote out architecture rant in readme
This commit is contained in:
+12
-231
@@ -1,246 +1,27 @@
|
||||
/**
|
||||
* JR Content Script
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* 1. This is not loaded as a module, which means it has limited permissions.
|
||||
* In particular, asynchronous calls are 1000x more annoying.
|
||||
* 2. All this does is relay messages between here and the background script
|
||||
* (i.e. application controller).
|
||||
*
|
||||
* @module
|
||||
*/
|
||||
|
||||
|
||||
jr_main();
|
||||
|
||||
|
||||
/**
|
||||
* This is the "meat" of what is spammed to the page script when the user makes
|
||||
* the wallet detectable.
|
||||
*
|
||||
* If you go read the AWCP documentation, there's a bunch of layers. This is I
|
||||
* think the innermost layer.
|
||||
*/
|
||||
function detect_msg() {
|
||||
return {id : "jr",
|
||||
name : "JR",
|
||||
networkId : "ae_uat",
|
||||
origin : "foobar",
|
||||
type : "extension"};
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Post {@link detect_awcp_msg} into the window message queue
|
||||
*/
|
||||
function
|
||||
post_detect_msg
|
||||
(msg: object)
|
||||
{
|
||||
window.postMessage(msg, '*');
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* For 2 minutes, make the wallet detectable to a page script
|
||||
*/
|
||||
async function
|
||||
mk_detectable
|
||||
(msg: object)
|
||||
{
|
||||
while (true)
|
||||
// 3 seconds times 40 is 2 minutes
|
||||
// for (let i=1; i<=40; i++)
|
||||
{
|
||||
console.error('pee');
|
||||
post_detect_msg(msg);
|
||||
await sleep(3000);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* sleep for the given number of ms
|
||||
*/
|
||||
async function
|
||||
sleep
|
||||
(ms: number)
|
||||
: Promise<void>
|
||||
{
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This handles messages from *other parts of the extension*
|
||||
*/
|
||||
function
|
||||
handler
|
||||
(msg: any)
|
||||
{
|
||||
console.error('message: ', msg);
|
||||
switch(msg)
|
||||
{
|
||||
case 'mk-detectable':
|
||||
mk_detectable();
|
||||
return;
|
||||
default:
|
||||
console.error('your mom is dead');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This handles messages from page scripts
|
||||
*/
|
||||
function
|
||||
window_message_handler
|
||||
(msg: {data: any})
|
||||
{
|
||||
console.error('the science is coming', msg);
|
||||
// example science:
|
||||
// {
|
||||
// "type": "to_waellet",
|
||||
// "data": {
|
||||
// "jsonrpc": "2.0",
|
||||
// "id": "ske-connect-1",
|
||||
// "method": "connection.open",
|
||||
// "params": {
|
||||
// "name": "sidekick examples",
|
||||
// "version": 1
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
let the_science = msg.data;
|
||||
console.error('THE SCIENCE: ', the_science);
|
||||
console.error('is the science good or bad?');
|
||||
if (the_science.type === 'to_waellet')
|
||||
{
|
||||
console.error('the science is good');
|
||||
the_science_is_good(the_science.data);
|
||||
}
|
||||
else
|
||||
console.error('the science is bad');
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* window_message_handler handles all messages sent into the event bus,
|
||||
* including messages that we sent (yay js). window_message_handler branches on
|
||||
* whether the message is for us or not (is the science good or bad?). If the
|
||||
* message is for us (the science is good), then this function is triggered.
|
||||
*
|
||||
* The bottom line is this is the function that *actually* handles messages
|
||||
* from the window
|
||||
*/
|
||||
function
|
||||
the_science_is_good
|
||||
(awcp_rcp_data: {id : string | number,
|
||||
method : string,
|
||||
params : object})
|
||||
{
|
||||
// example science data:
|
||||
// // layer 3: json rpc
|
||||
// {jsonrpc : "2.0",
|
||||
// id : "ske-connect-1",
|
||||
// method : "connection.open",
|
||||
// // layer 4: AWCP-specific semantics
|
||||
// params : {name : "sidekick examples",
|
||||
// version : 1}}}
|
||||
// can assume it is a call
|
||||
let msg_ident = awcp_rcp_data.id;
|
||||
let msg_method = awcp_rcp_data.method;
|
||||
// branch here on the "method" field
|
||||
switch (msg_method)
|
||||
{
|
||||
case "connection.open":
|
||||
post_connect_msg(msg_ident);
|
||||
break;
|
||||
case "address.subscribe":
|
||||
bg_address_subscribe(msg_ident);
|
||||
break;
|
||||
case "transaction.sign":
|
||||
bg_tx_sign(msg_ident, awcp_rcp_data.params);
|
||||
break;
|
||||
case "message.sign":
|
||||
bg_msg_sign(msg_ident, awcp_rcp_data.params);
|
||||
break;
|
||||
default:
|
||||
console.error('the science is worse than i initially thought');
|
||||
console.error("we're going to have to put the science to sleep");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called in response to "connection.open" requests from page scripts
|
||||
*
|
||||
* FIXME: this should query the user to see if he wants to connect
|
||||
*/
|
||||
function
|
||||
post_connect_msg
|
||||
(msg_ident : string | number)
|
||||
{
|
||||
// : EventData_W2A_connection_open
|
||||
// http://localhost:6969/local-awcp-0.2.1/types/EventData_W2A_connection_open.html
|
||||
let connect_response =
|
||||
{type: "to_aepp",
|
||||
data: {jsonrpc: "2.0",
|
||||
id: msg_ident,
|
||||
method: "connection.open",
|
||||
result: detect_msg()}};
|
||||
window.postMessage(connect_response, '*');
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Called in response to "address.subscribe" requests from page scripts
|
||||
*
|
||||
* this is to get the wallet's address
|
||||
*/
|
||||
function
|
||||
bg_address_subscribe
|
||||
(msg_ident: string | number)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Called in response to "transaction.sign" requests from page scripts
|
||||
*
|
||||
* user wants us to sign a transaction
|
||||
*/
|
||||
function
|
||||
bg_tx_sign
|
||||
(msg_ident : string | number,
|
||||
params : object)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Called in response to "message.sign" requests from page scripts
|
||||
*
|
||||
* user wants us to sign a message
|
||||
*/
|
||||
function
|
||||
bg_msg_sign
|
||||
(msg_ident : string | number,
|
||||
params : object)
|
||||
{
|
||||
}
|
||||
jr_content_main();
|
||||
|
||||
|
||||
async function
|
||||
jr_main
|
||||
jr_content_main
|
||||
()
|
||||
{
|
||||
// @ts-ignore browser
|
||||
// browser.runtime.onMessage.addListener(handler);
|
||||
window.addEventListener('message', window_message_handler);
|
||||
// @ts-ignore browser
|
||||
browser.runtime.onMessage.addListener(handler);
|
||||
window.addEventListener('message', page_script_message_handler);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* Definitions of messages that are passed between process A and process B in
|
||||
* JR. Example: how the content script talks to the background script.
|
||||
*
|
||||
* @module
|
||||
*/
|
||||
|
||||
/**
|
||||
* this is the message sent from the content script to the background script
|
||||
* when a page script requests
|
||||
*/
|
||||
type c2b_addr_subscribe = "address_subscribe";
|
||||
Reference in New Issue
Block a user