|  | // 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); | 
|  | }); | 
|  | } |