| @@ -66,8 +66,7 @@ class WBCollectionListing extends Component { | |||
| let prom = makeArvadosRequest(arvHost, arvToken, | |||
| '/arvados/v1/collections?filters=' + encodeURIComponent(JSON.stringify(filters)) + | |||
| '&limit=' + encodeURIComponent(itemsPerPage) + | |||
| '&offset=' + encodeURIComponent(itemsPerPage * activePage), | |||
| { 'orderStream': this.state.orderStream }); | |||
| '&offset=' + encodeURIComponent(itemsPerPage * activePage)); | |||
| let collections; | |||
| let numPages | |||
| @@ -1,4 +1,4 @@ | |||
| const requestOrdering = {}; | |||
| import wbApplyRequestOrdering from 'wb-apply-request-ordering'; | |||
| function makeArvadosRequest(arvHost, arvToken, endpoint, params={}) { | |||
| const defaultParams = { | |||
| @@ -7,22 +7,12 @@ function makeArvadosRequest(arvHost, arvToken, endpoint, params={}) { | |||
| 'contentType': 'application/json;charset=utf-8', | |||
| 'responseType': 'json', | |||
| 'useSsl': true, | |||
| 'requireToken': true, | |||
| 'orderStream': null | |||
| 'requireToken': true | |||
| }; | |||
| Object.keys(defaultParams).map(k => (params[k] = | |||
| (k in params ? params[k] : defaultParams[k]))); | |||
| let { method, data, contentType, responseType, useSsl, requireToken, orderStream } = params; | |||
| let orderId; | |||
| if (orderStream) { | |||
| if (!(orderStream in requestOrdering)) | |||
| requestOrdering[orderStream] = { 'counter': 0, 'started': [], 'completed': [] }; | |||
| requestOrdering[orderStream].counter += 1; | |||
| orderId = requestOrdering[orderStream].counter; | |||
| requestOrdering[orderStream].started.push(orderId); | |||
| } | |||
| let { method, data, contentType, responseType, useSsl, requireToken } = params; | |||
| if (!(arvHost && (arvToken || !requireToken))) | |||
| return new Promise((accept, reject) => reject()); | |||
| @@ -35,7 +25,7 @@ function makeArvadosRequest(arvHost, arvToken, endpoint, params={}) { | |||
| xhr.setRequestHeader('Content-Type', contentType); | |||
| xhr.responseType = responseType; | |||
| let res = new Promise((accept, reject) => { | |||
| let prom = new Promise((accept, reject) => { | |||
| xhr.onreadystatechange = () => { | |||
| if (xhr.readyState !== 4) | |||
| return; | |||
| @@ -47,7 +37,9 @@ function makeArvadosRequest(arvHost, arvToken, endpoint, params={}) { | |||
| xhr.send(data); | |||
| }); | |||
| return res; | |||
| // prom = wbApplyRequestOrdering(prom); | |||
| return prom; | |||
| } | |||
| export default makeArvadosRequest; | |||
| @@ -0,0 +1,66 @@ | |||
| const defaultOrderRegistry = {}; | |||
| function wbApplyRequestOrdering(prom, orderRegistry) { | |||
| let orderId; | |||
| if (!orderRegistry) | |||
| orderRegistry = defaultOrderRegistry; | |||
| if (Object.keys(orderRegistry).length === 0) { | |||
| orderRegistry.started = 0; | |||
| orderRegistry.pendingCompletion = {}; | |||
| orderRegistry.completed = { 0: true }; | |||
| } | |||
| orderRegistry.started += 1; | |||
| orderId = orderRegistry.started; | |||
| // console.log('New orderId: ' + orderId); | |||
| const orderCallback = ((isCatch, payload) => { | |||
| // console.log('orderId: ' + orderId + | |||
| // ', pendingCompletion: ' + Object.keys(orderRegistry.pendingCompletion) + | |||
| // ', completed: ' + Object.keys(orderRegistry.completed)); | |||
| if ((orderId - 1) in orderRegistry.completed) { | |||
| // console.log('Running: ' + orderId); | |||
| orderRegistry.completed[orderId] = true; | |||
| delete orderRegistry.pendingCompletion[orderId]; | |||
| const keys = Object.keys(orderRegistry.pendingCompletion); | |||
| keys.sort((a, b) => (a - b)); | |||
| keys.map(k => { | |||
| if ((k - 1) in orderRegistry.completed) { | |||
| // console.log('Running: ' + k); | |||
| orderRegistry.pendingCompletion[k](); | |||
| orderRegistry.completed[k] = true; | |||
| delete orderRegistry.pendingCompletion[k]; | |||
| } | |||
| }); | |||
| if (orderRegistry.started in orderRegistry.completed) { | |||
| // console.log('Garbage collect'); | |||
| orderRegistry.started = 0; | |||
| orderRegistry.completed = { 0: true }; | |||
| } | |||
| if (isCatch) | |||
| throw payload; | |||
| else | |||
| return payload; | |||
| } | |||
| const prom_1 = new Promise((accept, reject) => { | |||
| orderRegistry.pendingCompletion[orderId] = (() => | |||
| (isCatch ? reject(payload) : accept(payload))); | |||
| }); | |||
| return prom_1; | |||
| }); | |||
| prom = prom.then(xhr => orderCallback(false, xhr)); | |||
| prom = prom.catch(e => orderCallback(true, e)); | |||
| return prom; | |||
| } | |||
| export default wbApplyRequestOrdering; | |||