| // Copyright 2022 The IREE Authors | 
 | // | 
 | // Licensed under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 |  | 
 | // Promise-based API for interacting with the IREE runtime. | 
 |  | 
 | let ireeWorker = null; | 
 | let nextMessageId = 0; | 
 | const pendingPromises = {}; | 
 |  | 
 | // Communication protocol to and from the worker: | 
 | // { | 
 | //     'messageType': string | 
 | //         * the type of message (initialized, predict, etc.) | 
 | //     'id': number? | 
 | //         * optional id to disambiguate messages of the same type | 
 | //     'payload': Object? | 
 | //         * optional message data, format defined by message type | 
 | //     'error': string? | 
 | //         * optional error message | 
 | // } | 
 |  | 
 | function _handleMessageFromWorker(messageEvent) { | 
 |   const {messageType, id, payload, error} = messageEvent.data; | 
 |  | 
 |   if (messageType == 'initialized') { | 
 |     pendingPromises['initialize']['resolve'](); | 
 |     delete pendingPromises['initialize']; | 
 |   } else if (messageType == 'predictResult') { | 
 |     if (payload !== undefined) { | 
 |       pendingPromises[id]['resolve'](payload); | 
 |     } else { | 
 |       pendingPromises[id]['reject'](error); | 
 |     } | 
 |     delete pendingPromises[id]; | 
 |   } | 
 | } | 
 |  | 
 | // Initializes IREE's web worker asynchronously. | 
 | // Resolves when the worker is fully initialized. | 
 | function ireeInitializeWorker() { | 
 |   return new Promise((resolve, reject) => { | 
 |     pendingPromises['initialize'] = { | 
 |       'resolve': resolve, | 
 |       'reject': reject, | 
 |     }; | 
 |  | 
 |     ireeWorker = new Worker('iree_worker.js', {name: 'IREE-main'}); | 
 |     ireeWorker.onmessage = _handleMessageFromWorker; | 
 |   }); | 
 | } | 
 |  | 
 | // Predicts the handwritten digit in a provided image asynchronously. | 
 | // Input: 28x28 pixel data from CanvasRenderingContext2D.getImageData() | 
 | // Resolves with a Number in [0, 9] (inclusive) on success | 
 | function ireePredictDigit(imageData) { | 
 |   return new Promise((resolve, reject) => { | 
 |     const messageId = nextMessageId++; | 
 |     const message = { | 
 |       'messageType': 'predict', | 
 |       'id': messageId, | 
 |       'payload': imageData, | 
 |     }; | 
 |  | 
 |     pendingPromises[messageId] = { | 
 |       'resolve': resolve, | 
 |       'reject': reject, | 
 |     }; | 
 |  | 
 |     ireeWorker.postMessage(message); | 
 |   }); | 
 | } |