api.js
1 import axios from "axios"; 2 import keccak from "keccakjs"; 3 4 function hash(cnonce, token, type, path, params = {}) { 5 let hash = new keccak(); 6 hash.update(JSON.stringify(cnonce)); 7 hash.update(token); 8 hash.update(type.toUpperCase()); 9 hash.update(`/embark-api${path}`); 10 return hash.digest('hex'); 11 } 12 13 function request(type, path, params = {}) { 14 const cnonce = Date.now() + Math.random(); 15 16 // Extract credentials out of the params and delete so the token doesn't get sent 17 // as cleartext. 18 let credentials = params.credentials; 19 delete params.credentials; 20 21 let requestHash = hash(cnonce, credentials.token, type, path, params); 22 23 const endpoint = `http://${credentials.host}/embark-api${path}`; 24 const req = { 25 method: type, 26 url: endpoint, 27 headers: { 28 'X-Embark-Request-Hash': requestHash, 29 'X-Embark-Cnonce': cnonce 30 }, 31 ...(type === 'post' ? { data: params } : {}), 32 ...(type === 'get' ? { params: params.params } : {}) 33 } 34 35 return axios(req) 36 .then((response) => { 37 return (response.data && response.data.error) ? {error: response.data.error} : {response, error: null}; 38 }).catch((error) => { 39 return {response: null, error: error.message || 'Something bad happened'}; 40 }); 41 } 42 43 function get() { 44 return request('get', ...arguments); 45 } 46 47 function post() { 48 return request('post', ...arguments); 49 } 50 51 function destroy() { 52 return request('delete', ...arguments); 53 } 54 55 export function postCommand() { 56 return post('/command', ...arguments); 57 } 58 59 export function postCommandSuggestions() { 60 return post('/suggestions', ...arguments); 61 } 62 63 export function fetchAccounts() { 64 return get('/blockchain/accounts', ...arguments); 65 } 66 67 export function fetchAccount(payload) { 68 return get(`/blockchain/accounts/${payload.address}`, ...arguments); 69 } 70 71 export function fetchBlocks(payload) { 72 return get('/blockchain/blocks', {params: payload, credentials: payload.credentials}); 73 } 74 75 export function fetchBlock(payload) { 76 return get(`/blockchain/blocks/${payload.blockNumber}`, ...arguments); 77 } 78 79 export function fetchTransactions(payload) { 80 return get('/blockchain/transactions', {params: payload, credentials: payload.credentials}); 81 } 82 83 export function fetchTransaction(payload) { 84 return get(`/blockchain/transactions/${payload.hash}`, ...arguments); 85 } 86 87 export function fetchProcesses() { 88 return get('/processes', ...arguments); 89 } 90 91 export function fetchServices() { 92 return get('/services', ...arguments); 93 } 94 95 export function fetchProcessLogs(payload) { 96 return get(`/process-logs/${payload.processName}`, {params: payload, credentials: payload.credentials}); 97 } 98 99 export function fetchContractLogs() { 100 return get(`/contracts/logs`, ...arguments); 101 } 102 103 export function fetchContractEvents() { 104 return get(`/blockchain/contracts/events`, ...arguments); 105 } 106 107 export function fetchContracts() { 108 return get('/contracts', ...arguments); 109 } 110 111 export function fetchContract(payload) { 112 return get(`/contract/${payload.contractName}`, ...arguments); 113 } 114 115 export function postContractFunction(payload) { 116 return post(`/contract/${payload.contractName}/function`, ...arguments); 117 } 118 119 export function postContractDeploy(payload) { 120 return post(`/contract/${payload.contractName}/deploy`, ...arguments); 121 } 122 123 export function postContractCompile() { 124 return post('/contract/compile', ...arguments); 125 } 126 127 export function fetchVersions() { 128 return get('/versions', ...arguments); 129 } 130 131 export function fetchPlugins() { 132 return get('/plugins', ...arguments); 133 } 134 135 export function sendMessage(payload) { 136 return post(`/communication/sendMessage`, Object.assign({}, payload.body, {credentials: payload.credentials})); 137 } 138 139 export function fetchContractProfile(payload) { 140 return get(`/profiler/${payload.contractName}`, ...arguments); 141 } 142 143 export function fetchEnsRecord(payload) { 144 const _payload = {params: payload, credentials: payload.credentials}; 145 if (payload.name) { 146 return get('/ens/resolve', _payload); 147 } 148 149 return get('/ens/lookup', _payload); 150 } 151 152 export function postEnsRecord() { 153 return post('/ens/register', ...arguments); 154 } 155 156 export function getEthGasAPI() { 157 return get('/blockchain/gas/oracle', ...arguments); 158 } 159 160 export function fetchFiles() { 161 return get('/files', ...arguments); 162 } 163 164 export function fetchFile(payload) { 165 return get('/file', {params: payload, credentials: payload.credentials}); 166 } 167 168 export function postFile() { 169 return post('/files', ...arguments); 170 } 171 172 export function deleteFile(payload) { 173 return destroy('/file', {params: payload, credentials: payload.credentials}); 174 } 175 176 export function authenticate(payload) { 177 return post('/authenticate', {...payload, credentials: payload}); 178 } 179 180 export function signMessage(payload) { 181 return post('/messages/sign', ...arguments); 182 } 183 184 export function verifyMessage(payload) { 185 return post('/messages/verify', ...arguments); 186 } 187 188 export function startDebug(payload) { 189 return post('/debugger/start', {params: payload, credentials: payload.credentials}); 190 } 191 192 export function debugJumpBack(payload) { 193 return post('/debugger/jumpBack', {params: payload, credentials: payload.credentials}); 194 } 195 196 export function debugJumpForward(payload) { 197 return post('/debugger/jumpForward', {params: payload, credentials: payload.credentials}); 198 } 199 200 export function debugStepOverForward(payload) { 201 return post('/debugger/stepOverForward', {params: payload, credentials: payload.credentials}); 202 } 203 204 export function debugStepOverBackward(payload) { 205 return post('/debugger/stepOverBackward', {params: payload, credentials: payload.credentials}); 206 } 207 208 export function debugStepIntoForward(payload) { 209 return post('/debugger/stepIntoForward', {params: payload, credentials: payload.credentials}); 210 } 211 212 export function debugStepIntoBackward(payload) { 213 return post('/debugger/stepIntoBackward', {params: payload, credentials: payload.credentials}); 214 } 215 216 export function toggleBreakpoint(payload) { 217 return post('/debugger/breakpoint', {params: payload, credentials: payload.credentials}); 218 } 219 220 export function listenToDebugger(credentials) { 221 return new WebSocket(`ws://${credentials.host}/embark-api/debugger`, [credentials.token]); 222 } 223 224 export function listenToChannel(credentials, channel) { 225 return new WebSocket(`ws://${credentials.host}/embark-api/communication/listenTo/${channel}`, [credentials.token]); 226 } 227 228 export function webSocketProcess(credentials, processName) { 229 return new WebSocket(`ws://${credentials.host}/embark-api/process-logs/${processName}`, [credentials.token]); 230 } 231 232 export function webSocketContractLogs(credentials) { 233 return new WebSocket(`ws://${credentials.host}/embark-api/contracts/logs`, [credentials.token]); 234 } 235 236 export function webSocketContractEvents(credentials) { 237 return new WebSocket(`ws://${credentials.host}/embark-api/blockchain/contracts/event`, [credentials.token]); 238 } 239 240 export function webSocketBlockHeader(credentials) { 241 return new WebSocket(`ws://${credentials.host}/embark-api/blockchain/blockHeader`, [credentials.token]); 242 } 243 244 export function websocketGasOracle(credentials) { 245 return new WebSocket(`ws://${credentials.host}/embark-api/blockchain/gas/oracle`, [credentials.token]); 246 }